From 11735bed886724b761d9726931e2e5f93995db50 Mon Sep 17 00:00:00 2001 From: chinloong Date: Tue, 11 Jul 2017 16:18:26 +0800 Subject: [PATCH 001/388] Fix nil string parameter error --- Video.js | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Video.js b/Video.js index 4d69b3331c..b7c6b89d85 100644 --- a/Video.js +++ b/Video.js @@ -162,6 +162,8 @@ export default class Video extends Component { let uri = source.uri || ''; if (uri && uri.match(/^\//)) { uri = `file://${uri}`; + } else if (uri === '') { + return null; } const isNetwork = !!(uri && uri.match(/^https?:/)); From 519355ea58ff7bd015ece6de3ede81b41d873fc8 Mon Sep 17 00:00:00 2001 From: Robby Widyahartono Date: Tue, 10 Dec 2019 11:40:49 +0700 Subject: [PATCH 002/388] Implement Interactive Media Ads (IMA) SDK --- android-exoplayer/build.gradle | 1 + .../brentvatne/exoplayer/ExoPlayerView.java | 35 +++++++- .../exoplayer/ReactExoplayerView.java | 47 +++++++++- .../exoplayer/ReactExoplayerViewManager.java | 18 ++++ examples/basic/index.android.js | 6 ++ examples/basic/index.ios.js | 6 ++ examples/basic/ios/Podfile | 48 ++++++++++ examples/basic/package.json | 2 +- ios/Video/RCTVideo.h | 11 ++- ios/Video/RCTVideo.m | 89 ++++++++++++++++++- ios/Video/RCTVideoManager.m | 1 + react-native-video.podspec | 7 +- 12 files changed, 257 insertions(+), 14 deletions(-) create mode 100644 examples/basic/ios/Podfile diff --git a/android-exoplayer/build.gradle b/android-exoplayer/build.gradle index 502fa59947..ac7acd8560 100644 --- a/android-exoplayer/build.gradle +++ b/android-exoplayer/build.gradle @@ -26,6 +26,7 @@ dependencies { implementation('com.google.android.exoplayer:exoplayer:2.10.5') { exclude group: 'com.android.support' } + implementation 'com.google.android.exoplayer:extension-ima:2.10.5' // All support libs must use the same version implementation "androidx.annotation:annotation:1.1.0" diff --git a/android-exoplayer/src/main/java/com/brentvatne/exoplayer/ExoPlayerView.java b/android-exoplayer/src/main/java/com/brentvatne/exoplayer/ExoPlayerView.java index 9f3d09bed0..a8d6311a2b 100644 --- a/android-exoplayer/src/main/java/com/brentvatne/exoplayer/ExoPlayerView.java +++ b/android-exoplayer/src/main/java/com/brentvatne/exoplayer/ExoPlayerView.java @@ -18,16 +18,19 @@ import com.google.android.exoplayer2.PlaybackParameters; import com.google.android.exoplayer2.SimpleExoPlayer; import com.google.android.exoplayer2.Timeline; +import com.google.android.exoplayer2.source.ads.AdsLoader; import com.google.android.exoplayer2.source.TrackGroupArray; import com.google.android.exoplayer2.text.Cue; import com.google.android.exoplayer2.text.TextRenderer; import com.google.android.exoplayer2.trackselection.TrackSelectionArray; import com.google.android.exoplayer2.ui.SubtitleView; +import com.google.android.exoplayer2.util.Assertions; import java.util.List; +import java.util.ArrayList; @TargetApi(16) -public final class ExoPlayerView extends FrameLayout { +public final class ExoPlayerView extends FrameLayout implements AdsLoader.AdViewProvider { private View surfaceView; private final View shutterView; @@ -37,6 +40,7 @@ public final class ExoPlayerView extends FrameLayout { private SimpleExoPlayer player; private Context context; private ViewGroup.LayoutParams layoutParams; + private final FrameLayout adOverlayFrameLayout; private boolean useTextureView = true; private boolean hideShutterView = false; @@ -81,7 +85,11 @@ public ExoPlayerView(Context context, AttributeSet attrs, int defStyleAttr) { layout.addView(shutterView, 1, layoutParams); layout.addView(subtitleLayout, 2, layoutParams); + adOverlayFrameLayout = new FrameLayout(context); + addViewInLayout(layout, 0, aspectRatioParams); + addViewInLayout(adOverlayFrameLayout, 1, layoutParams); + } private void setVideoView() { @@ -111,6 +119,31 @@ private void updateShutterViewVisibility() { shutterView.setVisibility(this.hideShutterView ? View.INVISIBLE : View.VISIBLE); } + @Override + public void requestLayout() { + super.requestLayout(); + post(measureAndLayout); + } + + // AdsLoader.AdViewProvider implementation. + + @Override + public ViewGroup getAdViewGroup() { + return Assertions.checkNotNull(adOverlayFrameLayout, "exo_ad_overlay must be present for ad playback"); + } + + @Override + public View[] getAdOverlayViews() { + ArrayList overlayViews = new ArrayList<>(); + if (adOverlayFrameLayout != null) { + overlayViews.add(adOverlayFrameLayout); + } + // if (controller != null) { + // overlayViews.add(controller); + // } + return overlayViews.toArray(new View[0]); + } + /** * Set the {@link SimpleExoPlayer} to use. The {@link SimpleExoPlayer#setTextOutput} and * {@link SimpleExoPlayer#setVideoListener} method of the player will be called and previous diff --git a/android-exoplayer/src/main/java/com/brentvatne/exoplayer/ReactExoplayerView.java b/android-exoplayer/src/main/java/com/brentvatne/exoplayer/ReactExoplayerView.java index 4802a5a435..0572f66ae1 100644 --- a/android-exoplayer/src/main/java/com/brentvatne/exoplayer/ReactExoplayerView.java +++ b/android-exoplayer/src/main/java/com/brentvatne/exoplayer/ReactExoplayerView.java @@ -63,9 +63,13 @@ import com.google.android.exoplayer2.upstream.DefaultBandwidthMeter; import com.google.android.exoplayer2.util.Util; +import com.google.android.exoplayer2.ext.ima.ImaAdsLoader; +import com.google.android.exoplayer2.source.ads.AdsMediaSource; + import java.net.CookieHandler; import java.net.CookieManager; import java.net.CookiePolicy; +import java.net.URI; import java.util.ArrayList; import java.util.Locale; import java.util.Map; @@ -77,7 +81,8 @@ class ReactExoplayerView extends FrameLayout implements BandwidthMeter.EventListener, BecomingNoisyListener, AudioManager.OnAudioFocusChangeListener, - MetadataOutput { + MetadataOutput, + AdsMediaSource.MediaSourceFactory { private static final String TAG = "ReactExoplayerView"; @@ -97,6 +102,7 @@ class ReactExoplayerView extends FrameLayout implements private Player.EventListener eventListener; private ExoPlayerView exoPlayerView; + private ImaAdsLoader adsLoader; private DataSource.Factory mediaDataSourceFactory; private SimpleExoPlayer player; @@ -139,6 +145,7 @@ class ReactExoplayerView extends FrameLayout implements private Map requestHeaders; private boolean mReportBandwidth = false; private boolean controls; + private Uri adTagUrl; // \ End props // React @@ -155,6 +162,9 @@ public void handleMessage(Message msg) { && player.getPlaybackState() == Player.STATE_READY && player.getPlayWhenReady() ) { + if (isPlayingAd()) { + playerControlView.hide(); + } long pos = player.getCurrentPosition(); long bufferedDuration = player.getBufferedPercentage() * player.getDuration() / 100; eventEmitter.progressChanged(pos, bufferedDuration, player.getDuration()); @@ -173,6 +183,8 @@ public ReactExoplayerView(ThemedReactContext context, ReactExoplayerConfig confi this.config = config; this.bandwidthMeter = config.getBandwidthMeter(); + adsLoader = new ImaAdsLoader(this.themedReactContext, Uri.EMPTY); + createViews(); audioManager = (AudioManager) context.getSystemService(Context.AUDIO_SERVICE); @@ -182,6 +194,10 @@ public ReactExoplayerView(ThemedReactContext context, ReactExoplayerConfig confi initializePlayer(); } + private boolean isPlayingAd() { + return player != null && player.isPlayingAd() && player.getPlayWhenReady(); + } + @Override public void setId(int id) { @@ -288,7 +304,9 @@ private void initializePlayerControl() { exoPlayerView.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { - togglePlayerControlVisibility(); + if (!isPlayingAd()) { + togglePlayerControlVisibility(); + } } }); @@ -360,6 +378,7 @@ public void run() { trackSelector, defaultLoadControl, null, bandwidthMeter); player.addListener(self); player.addMetadataOutput(self); + adsLoader.setPlayer(player); exoPlayerView.setPlayer(player); audioBecomingNoisyReceiver.setListener(self); bandwidthMeter.addEventListener(new Handler(), self); @@ -372,11 +391,12 @@ public void run() { if (playerNeedsSource && srcUri != null) { ArrayList mediaSourceList = buildTextSources(); MediaSource videoSource = buildMediaSource(srcUri, extension); + MediaSource mediaSourceWithAds = new AdsMediaSource(videoSource, mediaDataSourceFactory, adsLoader, exoPlayerView); MediaSource mediaSource; if (mediaSourceList.size() == 0) { - mediaSource = videoSource; + mediaSource = mediaSourceWithAds; } else { - mediaSourceList.add(0, videoSource); + mediaSourceList.add(0, mediaSourceWithAds); MediaSource[] textSourceArray = mediaSourceList.toArray( new MediaSource[mediaSourceList.size()] ); @@ -402,6 +422,19 @@ public void run() { }, 1); } + // AdsMediaSource.MediaSourceFactory implementation. + + @Override + public MediaSource createMediaSource(Uri uri) { + return buildMediaSource(uri, extension); + } + + @Override + public int[] getSupportedTypes() { + // IMA does not support Smooth Streaming ads. + return new int[] {C.TYPE_DASH, C.TYPE_HLS, C.TYPE_OTHER}; + } + private MediaSource buildMediaSource(Uri uri, String overrideExtension) { int type = Util.inferContentType(!TextUtils.isEmpty(overrideExtension) ? "." + overrideExtension : uri.getLastPathSegment()); @@ -473,6 +506,7 @@ private void releasePlayer() { trackSelector = null; player = null; } + adsLoader.release(); progressHandler.removeMessages(SHOW_PROGRESS); themedReactContext.removeLifecycleEventListener(this); audioBecomingNoisyReceiver.removeListener(); @@ -914,6 +948,11 @@ public void setReportBandwidth(boolean reportBandwidth) { mReportBandwidth = reportBandwidth; } + public void setAdTagUrl(final Uri uri) { + adTagUrl = uri; + adsLoader = new ImaAdsLoader(this.themedReactContext, adTagUrl); + } + public void setRawSrc(final Uri uri, final String extension) { if (uri != null) { boolean isOriginalSourceNull = srcUri == null; diff --git a/android-exoplayer/src/main/java/com/brentvatne/exoplayer/ReactExoplayerViewManager.java b/android-exoplayer/src/main/java/com/brentvatne/exoplayer/ReactExoplayerViewManager.java index c7c9634644..b793a882ea 100644 --- a/android-exoplayer/src/main/java/com/brentvatne/exoplayer/ReactExoplayerViewManager.java +++ b/android-exoplayer/src/main/java/com/brentvatne/exoplayer/ReactExoplayerViewManager.java @@ -25,6 +25,7 @@ public class ReactExoplayerViewManager extends ViewGroupManager diff --git a/examples/basic/index.ios.js b/examples/basic/index.ios.js index 1bc0ac4739..ed2675f69a 100644 --- a/examples/basic/index.ios.js +++ b/examples/basic/index.ios.js @@ -15,6 +15,11 @@ import { import Video,{FilterType} from 'react-native-video'; +const adTagUrl = "https://pubads.g.doubleclick.net/gampad/ads?sz=640x480&iu=/124319096/external/" ++ "ad_rule_samples&ciu_szs=300x250&ad_rule=1&impl=s&gdfp_req=1&env=vp" ++ "&output=vmap&unviewed_position_start=1&cust_params=deployment%3Ddevsite" ++ "%26sample_ar%3Dpremidpost&cmsid=496&vid=short_onecue&correlator="; + const filterTypes = [ FilterType.NONE, FilterType.INVERT, @@ -266,6 +271,7 @@ class VideoPlayer extends Component { controls={this.state.controls} filter={this.state.filter} filterEnabled={this.state.filterEnabled} + adTagUrl={adTagUrl} /> diff --git a/examples/basic/ios/Podfile b/examples/basic/ios/Podfile new file mode 100644 index 0000000000..0b90640fc9 --- /dev/null +++ b/examples/basic/ios/Podfile @@ -0,0 +1,48 @@ +# Uncomment the next line to define a global platform for your project +platform :ios, '9.0' + +target 'VideoPlayer' do + # Comment the next line if you don't want to use dynamic frameworks + use_frameworks! + pod 'FBLazyVector', :path => "../node_modules/react-native/Libraries/FBLazyVector" + pod 'FBReactNativeSpec', :path => "../node_modules/react-native/Libraries/FBReactNativeSpec" + pod 'RCTRequired', :path => "../node_modules/react-native/Libraries/RCTRequired" + pod 'RCTTypeSafety', :path => "../node_modules/react-native/Libraries/TypeSafety" + pod 'React', :path => '../node_modules/react-native/' + pod 'React-Core', :path => '../node_modules/react-native/' + pod 'React-CoreModules', :path => '../node_modules/react-native/React/CoreModules' + pod 'React-Core/DevSupport', :path => '../node_modules/react-native/' + pod 'React-RCTActionSheet', :path => '../node_modules/react-native/Libraries/ActionSheetIOS' + pod 'React-RCTAnimation', :path => '../node_modules/react-native/Libraries/NativeAnimation' + pod 'React-RCTBlob', :path => '../node_modules/react-native/Libraries/Blob' + pod 'React-RCTImage', :path => '../node_modules/react-native/Libraries/Image' + pod 'React-RCTLinking', :path => '../node_modules/react-native/Libraries/LinkingIOS' + pod 'React-RCTNetwork', :path => '../node_modules/react-native/Libraries/Network' + pod 'React-RCTSettings', :path => '../node_modules/react-native/Libraries/Settings' + pod 'React-RCTText', :path => '../node_modules/react-native/Libraries/Text' + pod 'React-RCTVibration', :path => '../node_modules/react-native/Libraries/Vibration' + pod 'React-Core/RCTWebSocket', :path => '../node_modules/react-native/' + + pod 'React-cxxreact', :path => '../node_modules/react-native/ReactCommon/cxxreact' + pod 'React-jsi', :path => '../node_modules/react-native/ReactCommon/jsi' + pod 'React-jsiexecutor', :path => '../node_modules/react-native/ReactCommon/jsiexecutor' + pod 'React-jsinspector', :path => '../node_modules/react-native/ReactCommon/jsinspector' + pod 'ReactCommon/jscallinvoker', :path => "../node_modules/react-native/ReactCommon" + pod 'ReactCommon/turbomodule/core', :path => "../node_modules/react-native/ReactCommon" + pod 'Yoga', :path => '../node_modules/react-native/ReactCommon/yoga' + + pod 'DoubleConversion', :podspec => '../node_modules/react-native/third-party-podspecs/DoubleConversion.podspec' + pod 'glog', :podspec => '../node_modules/react-native/third-party-podspecs/glog.podspec' + pod 'Folly', :podspec => '../node_modules/react-native/third-party-podspecs/Folly.podspec' + + # Pods for VideoPlayer + pod 'react-native-video', :path => '../node_modules/react-native-video' +end + +target 'VideoPlayer-tvOS' do + # Comment the next line if you don't want to use dynamic frameworks + use_frameworks! + + # Pods for VideoPlayer-tvOS + +end diff --git a/examples/basic/package.json b/examples/basic/package.json index 057dcac7ac..83a991ac3a 100644 --- a/examples/basic/package.json +++ b/examples/basic/package.json @@ -10,7 +10,7 @@ }, "dependencies": { "react": "16.9.0", - "react-native": "0.60.5", + "react-native": "0.61.5", "react-native-video": "file:../.." }, "devDependencies": { diff --git a/ios/Video/RCTVideo.h b/ios/Video/RCTVideo.h index 26d436c2e1..bf9eac1fbe 100644 --- a/ios/Video/RCTVideo.h +++ b/ios/Video/RCTVideo.h @@ -5,6 +5,7 @@ #import "RCTVideoPlayerViewControllerDelegate.h" #import #import +@import GoogleInteractiveMediaAds; #if __has_include() #import @@ -14,11 +15,11 @@ @class RCTEventDispatcher; #if __has_include() -@interface RCTVideo : UIView +@interface RCTVideo : UIView #elif TARGET_OS_TV @interface RCTVideo : UIView #else -@interface RCTVideo : UIView +@interface RCTVideo : UIView #endif @property (nonatomic, copy) RCTDirectEventBlock onVideoLoadStart; @@ -42,6 +43,12 @@ @property (nonatomic, copy) RCTDirectEventBlock onVideoExternalPlaybackChange; @property (nonatomic, copy) RCTDirectEventBlock onPictureInPictureStatusChanged; @property (nonatomic, copy) RCTDirectEventBlock onRestoreUserInterfaceForPictureInPictureStop; +/// Playhead used by the SDK to track content video progress and insert mid-rolls. +@property(nonatomic, strong) IMAAVPlayerContentPlayhead *contentPlayhead; +/// Entry point for the SDK. Used to make ad requests. +@property(nonatomic, strong) IMAAdsLoader *adsLoader; +/// Main point of interaction with the SDK. Created by the SDK as the result of an ad request. +@property(nonatomic, strong) IMAAdsManager *adsManager; - (instancetype)initWithEventDispatcher:(RCTEventDispatcher *)eventDispatcher NS_DESIGNATED_INITIALIZER; diff --git a/ios/Video/RCTVideo.m b/ios/Video/RCTVideo.m index 113d9f2364..46ab23d0ad 100644 --- a/ios/Video/RCTVideo.m +++ b/ios/Video/RCTVideo.m @@ -39,6 +39,7 @@ @implementation RCTVideo BOOL _playbackRateObserverRegistered; BOOL _isExternalPlaybackActiveObserverRegistered; BOOL _videoLoadStarted; + BOOL _isRequestAds; bool _pendingSeek; float _pendingSeekTime; @@ -73,6 +74,7 @@ @implementation RCTVideo NSString * _fullscreenOrientation; BOOL _fullscreenPlayerPresented; NSString *_filterName; + NSString * _adTagUrl; BOOL _filterEnabled; UIViewController * _presentingViewController; #if __has_include() @@ -107,6 +109,7 @@ - (instancetype)initWithEventDispatcher:(RCTEventDispatcher *)eventDispatcher _allowsExternalPlayback = YES; _playWhenInactive = false; _pictureInPicture = false; + _isRequestAds = false; _ignoreSilentSwitch = @"inherit"; // inherit, ignore, obey #if TARGET_OS_IOS _restoreUserInterfaceForPIPStopCompletionHandler = NULL; @@ -144,6 +147,8 @@ - (RCTVideoPlayerViewController*)createPlayerViewController:(AVPlayer*)player viewController.showsPlaybackControls = YES; viewController.rctDelegate = self; viewController.preferredOrientation = _fullscreenOrientation; + self.contentPlayhead = [[IMAAVPlayerContentPlayhead alloc] initWithAVPlayer:player]; + [self setupAdsLoader]; viewController.view.frame = self.bounds; viewController.player = player; @@ -267,8 +272,12 @@ - (void)sendProgressUpdate const Float64 currentTimeSecs = CMTimeGetSeconds(currentTime); [[NSNotificationCenter defaultCenter] postNotificationName:@"RCTVideo_progress" object:nil userInfo:@{@"progress": [NSNumber numberWithDouble: currentTimeSecs / duration]}]; - + if( currentTimeSecs >= 0 && self.onVideoProgress) { + if(!_isRequestAds && !_paused) { + [self requestAds]; + _isRequestAds = true; + } self.onVideoProgress(@{ @"currentTime": [NSNumber numberWithFloat:CMTimeGetSeconds(currentTime)], @"playableDuration": [self calculatePlayableDuration], @@ -659,7 +668,6 @@ - (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(N @"target": self.reactTag}); } _videoLoadStarted = NO; - [self attachListeners]; [self applyModifiers]; } else if (_playerItem.status == AVPlayerItemStatusFailed && self.onVideoError) { @@ -719,6 +727,74 @@ - (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(N } } +- (void)setupAdsLoader { + // Re-use this IMAAdsLoader instance for the entire lifecycle of your app. + self.adsLoader = [[IMAAdsLoader alloc] initWithSettings:nil]; + // NOTE: This line will cause a warning until the next step, "Get the Ads Manager". + self.adsLoader.delegate = self; +} + +- (void)requestAds { + // Create an ad display container for ad rendering. + IMAAdDisplayContainer *adDisplayContainer = + [[IMAAdDisplayContainer alloc] initWithAdContainer:self companionSlots:nil]; + // Create an ad request with our ad tag, display container, and optional user context. + IMAAdsRequest *request = [[IMAAdsRequest alloc] initWithAdTagUrl:_adTagUrl + adDisplayContainer:adDisplayContainer + contentPlayhead:self.contentPlayhead + userContext:nil]; + [self.adsLoader requestAdsWithRequest:request]; +} + +#pragma mark AdsLoader Delegates + +- (void)adsLoader:(IMAAdsLoader *)loader adsLoadedWithData:(IMAAdsLoadedData *)adsLoadedData { + // Grab the instance of the IMAAdsManager and set ourselves as the delegate. + self.adsManager = adsLoadedData.adsManager; + + // NOTE: This line will cause a warning until the next step, "Display Ads". + self.adsManager.delegate = self; + + // Create ads rendering settings and tell the SDK to use the in-app browser. + IMAAdsRenderingSettings *adsRenderingSettings = [[IMAAdsRenderingSettings alloc] init]; + adsRenderingSettings.webOpenerPresentingController = _playerViewController; + + // Initialize the ads manager. + [self.adsManager initializeWithAdsRenderingSettings:adsRenderingSettings]; +} + +- (void)adsLoader:(IMAAdsLoader *)loader failedWithErrorData:(IMAAdLoadingErrorData *)adErrorData { + // Something went wrong loading ads. Log the error and play the content. + NSLog(@"Error loading ads: %@", adErrorData.adError.message); + [_player play]; +} + +#pragma mark AdsManager Delegates + +- (void)adsManager:(IMAAdsManager *)adsManager didReceiveAdEvent:(IMAAdEvent *)event { + if (event.type == kIMAAdEvent_LOADED) { + // When the SDK notifies us that ads have been loaded, play them. + [adsManager start]; + } +} + +- (void)adsManager:(IMAAdsManager *)adsManager didReceiveAdError:(IMAAdError *)error { + // Something went wrong with the ads manager after ads were loaded. Log the error and play the + // content. + NSLog(@"AdsManager error: %@", error.message); + [_player play]; +} + +- (void)adsManagerDidRequestContentPause:(IMAAdsManager *)adsManager { + // The SDK is going to play ads, so pause the content. + [_player pause]; +} + +- (void)adsManagerDidRequestContentResume:(IMAAdsManager *)adsManager { + // The SDK is done playing ads (at least for now), so resume the content. + [_player play]; +} + - (void)attachListeners { // listen for end of file @@ -769,6 +845,9 @@ - (void)playbackStalled:(NSNotification *)notification - (void)playerItemDidReachEnd:(NSNotification *)notification { + if (notification.object == _player.currentItem) { + [self.adsLoader contentComplete]; + } if(self.onVideoEnd) { self.onVideoEnd(@{@"target": self.reactTag}); } @@ -868,7 +947,7 @@ - (void)setPaused:(BOOL)paused } else if([_ignoreSilentSwitch isEqualToString:@"obey"]) { [[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryAmbient error:nil]; } - + if (@available(iOS 10.0, *) && !_automaticallyWaitsToMinimizeStalling) { [_player playImmediatelyAtRate:_rate]; } else { @@ -1434,6 +1513,10 @@ - (void)setFilterEnabled:(BOOL)filterEnabled { _filterEnabled = filterEnabled; } +- (void)setAdTagUrl:(NSString *)adTagUrl { + _adTagUrl = adTagUrl; +} + #pragma mark - React View Management - (void)insertReactSubview:(UIView *)view atIndex:(NSInteger)atIndex diff --git a/ios/Video/RCTVideoManager.m b/ios/Video/RCTVideoManager.m index 7233646f37..a817ec8d9e 100644 --- a/ios/Video/RCTVideoManager.m +++ b/ios/Video/RCTVideoManager.m @@ -19,6 +19,7 @@ - (dispatch_queue_t)methodQueue } RCT_EXPORT_VIEW_PROPERTY(src, NSDictionary); +RCT_EXPORT_VIEW_PROPERTY(adTagUrl, NSString); RCT_EXPORT_VIEW_PROPERTY(maxBitRate, float); RCT_EXPORT_VIEW_PROPERTY(resizeMode, NSString); RCT_EXPORT_VIEW_PROPERTY(repeat, BOOL); diff --git a/react-native-video.podspec b/react-native-video.podspec index 98ba5537e8..6a522748ac 100644 --- a/react-native-video.podspec +++ b/react-native-video.podspec @@ -12,10 +12,12 @@ Pod::Spec.new do |s| s.homepage = 'https://github.com/react-native-community/react-native-video' s.source = { :git => "https://github.com/react-native-community/react-native-video.git", :tag => "#{s.version}" } - s.ios.deployment_target = "8.0" + s.ios.deployment_target = "9.0" s.tvos.deployment_target = "9.0" s.subspec "Video" do |ss| + ss.dependency "GoogleAds-IMA-iOS-SDK", "~> 3.9" + ss.source_files = "ios/Video/*.{h,m}" s.static_framework = true end @@ -29,7 +31,6 @@ Pod::Spec.new do |s| s.static_framework = true end - s.dependency "React" - + s.dependency 'React' s.default_subspec = "Video" end From bf3efb5303df14e56b0bc9630636f26115de53f2 Mon Sep 17 00:00:00 2001 From: Robby Widyahartono Date: Tue, 10 Dec 2019 11:47:48 +0700 Subject: [PATCH 003/388] change deployment target to 9.0 --- examples/basic/ios/VideoPlayer.xcodeproj/project.pbxproj | 4 ++-- ios/RCTVideo.xcodeproj/project.pbxproj | 5 +++-- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/examples/basic/ios/VideoPlayer.xcodeproj/project.pbxproj b/examples/basic/ios/VideoPlayer.xcodeproj/project.pbxproj index db5f9a3933..91e4e3a0cf 100644 --- a/examples/basic/ios/VideoPlayer.xcodeproj/project.pbxproj +++ b/examples/basic/ios/VideoPlayer.xcodeproj/project.pbxproj @@ -1091,7 +1091,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 8.0; + IPHONEOS_DEPLOYMENT_TARGET = 9.0; MTL_ENABLE_DEBUG_INFO = YES; ONLY_ACTIVE_ARCH = YES; SDKROOT = iphoneos; @@ -1126,7 +1126,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 8.0; + IPHONEOS_DEPLOYMENT_TARGET = 9.0; MTL_ENABLE_DEBUG_INFO = NO; SDKROOT = iphoneos; VALIDATE_PRODUCT = YES; diff --git a/ios/RCTVideo.xcodeproj/project.pbxproj b/ios/RCTVideo.xcodeproj/project.pbxproj index 4e675ac782..1761485ff1 100644 --- a/ios/RCTVideo.xcodeproj/project.pbxproj +++ b/ios/RCTVideo.xcodeproj/project.pbxproj @@ -163,6 +163,7 @@ developmentRegion = English; hasScannedForEncodings = 0; knownRegions = ( + English, en, ); mainGroup = 58B511D21A9E6C8500147676; @@ -236,7 +237,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 7.0; + IPHONEOS_DEPLOYMENT_TARGET = 9.0; MTL_ENABLE_DEBUG_INFO = YES; ONLY_ACTIVE_ARCH = YES; SDKROOT = iphoneos; @@ -270,7 +271,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 7.0; + IPHONEOS_DEPLOYMENT_TARGET = 9.0; MTL_ENABLE_DEBUG_INFO = NO; SDKROOT = iphoneos; VALIDATE_PRODUCT = YES; From 9f3d63a37df272bb673b8c34d0a5b5a3e43c5b23 Mon Sep 17 00:00:00 2001 From: Robby Widyahartono Date: Tue, 10 Dec 2019 12:09:38 +0700 Subject: [PATCH 004/388] update basic example app --- examples/basic/index.ios.js | 6 +- examples/basic/ios/Podfile.lock | 351 ++++++++++++++++ .../ios/VideoPlayer.xcodeproj/project.pbxproj | 166 ++++++-- examples/basic/yarn.lock | 381 +++++++++--------- ios/Video/RCTVideo.m | 2 +- 5 files changed, 689 insertions(+), 217 deletions(-) create mode 100644 examples/basic/ios/Podfile.lock diff --git a/examples/basic/index.ios.js b/examples/basic/index.ios.js index ed2675f69a..6fe74c362f 100644 --- a/examples/basic/index.ios.js +++ b/examples/basic/index.ios.js @@ -4,7 +4,7 @@ import React, { } from 'react'; import { - AlertIOS, + Alert, AppRegistry, Platform, StyleSheet, @@ -179,7 +179,7 @@ class VideoPlayer extends Component { onLoad={this.onLoad} onBuffer={this.onBuffer} onProgress={this.onProgress} - onEnd={() => { AlertIOS.alert('Done!') }} + onEnd={() => { Alert.alert('Done!') }} repeat={true} filter={this.state.filter} filterEnabled={this.state.filterEnabled} @@ -266,7 +266,7 @@ class VideoPlayer extends Component { onLoad={this.onLoad} onBuffer={this.onBuffer} onProgress={this.onProgress} - onEnd={() => { AlertIOS.alert('Done!') }} + onEnd={() => { Alert.alert('Done!') }} repeat={true} controls={this.state.controls} filter={this.state.filter} diff --git a/examples/basic/ios/Podfile.lock b/examples/basic/ios/Podfile.lock new file mode 100644 index 0000000000..281930b9fd --- /dev/null +++ b/examples/basic/ios/Podfile.lock @@ -0,0 +1,351 @@ +PODS: + - boost-for-react-native (1.63.0) + - DoubleConversion (1.1.6) + - FBLazyVector (0.61.5) + - FBReactNativeSpec (0.61.5): + - Folly (= 2018.10.22.00) + - RCTRequired (= 0.61.5) + - RCTTypeSafety (= 0.61.5) + - React-Core (= 0.61.5) + - React-jsi (= 0.61.5) + - ReactCommon/turbomodule/core (= 0.61.5) + - Folly (2018.10.22.00): + - boost-for-react-native + - DoubleConversion + - Folly/Default (= 2018.10.22.00) + - glog + - Folly/Default (2018.10.22.00): + - boost-for-react-native + - DoubleConversion + - glog + - glog (0.3.5) + - GoogleAds-IMA-iOS-SDK (3.10.1) + - RCTRequired (0.61.5) + - RCTTypeSafety (0.61.5): + - FBLazyVector (= 0.61.5) + - Folly (= 2018.10.22.00) + - RCTRequired (= 0.61.5) + - React-Core (= 0.61.5) + - React (0.61.5): + - React-Core (= 0.61.5) + - React-Core/DevSupport (= 0.61.5) + - React-Core/RCTWebSocket (= 0.61.5) + - React-RCTActionSheet (= 0.61.5) + - React-RCTAnimation (= 0.61.5) + - React-RCTBlob (= 0.61.5) + - React-RCTImage (= 0.61.5) + - React-RCTLinking (= 0.61.5) + - React-RCTNetwork (= 0.61.5) + - React-RCTSettings (= 0.61.5) + - React-RCTText (= 0.61.5) + - React-RCTVibration (= 0.61.5) + - React-Core (0.61.5): + - Folly (= 2018.10.22.00) + - glog + - React-Core/Default (= 0.61.5) + - React-cxxreact (= 0.61.5) + - React-jsi (= 0.61.5) + - React-jsiexecutor (= 0.61.5) + - Yoga + - React-Core/CoreModulesHeaders (0.61.5): + - Folly (= 2018.10.22.00) + - glog + - React-Core/Default + - React-cxxreact (= 0.61.5) + - React-jsi (= 0.61.5) + - React-jsiexecutor (= 0.61.5) + - Yoga + - React-Core/Default (0.61.5): + - Folly (= 2018.10.22.00) + - glog + - React-cxxreact (= 0.61.5) + - React-jsi (= 0.61.5) + - React-jsiexecutor (= 0.61.5) + - Yoga + - React-Core/DevSupport (0.61.5): + - Folly (= 2018.10.22.00) + - glog + - React-Core/Default (= 0.61.5) + - React-Core/RCTWebSocket (= 0.61.5) + - React-cxxreact (= 0.61.5) + - React-jsi (= 0.61.5) + - React-jsiexecutor (= 0.61.5) + - React-jsinspector (= 0.61.5) + - Yoga + - React-Core/RCTActionSheetHeaders (0.61.5): + - Folly (= 2018.10.22.00) + - glog + - React-Core/Default + - React-cxxreact (= 0.61.5) + - React-jsi (= 0.61.5) + - React-jsiexecutor (= 0.61.5) + - Yoga + - React-Core/RCTAnimationHeaders (0.61.5): + - Folly (= 2018.10.22.00) + - glog + - React-Core/Default + - React-cxxreact (= 0.61.5) + - React-jsi (= 0.61.5) + - React-jsiexecutor (= 0.61.5) + - Yoga + - React-Core/RCTBlobHeaders (0.61.5): + - Folly (= 2018.10.22.00) + - glog + - React-Core/Default + - React-cxxreact (= 0.61.5) + - React-jsi (= 0.61.5) + - React-jsiexecutor (= 0.61.5) + - Yoga + - React-Core/RCTImageHeaders (0.61.5): + - Folly (= 2018.10.22.00) + - glog + - React-Core/Default + - React-cxxreact (= 0.61.5) + - React-jsi (= 0.61.5) + - React-jsiexecutor (= 0.61.5) + - Yoga + - React-Core/RCTLinkingHeaders (0.61.5): + - Folly (= 2018.10.22.00) + - glog + - React-Core/Default + - React-cxxreact (= 0.61.5) + - React-jsi (= 0.61.5) + - React-jsiexecutor (= 0.61.5) + - Yoga + - React-Core/RCTNetworkHeaders (0.61.5): + - Folly (= 2018.10.22.00) + - glog + - React-Core/Default + - React-cxxreact (= 0.61.5) + - React-jsi (= 0.61.5) + - React-jsiexecutor (= 0.61.5) + - Yoga + - React-Core/RCTSettingsHeaders (0.61.5): + - Folly (= 2018.10.22.00) + - glog + - React-Core/Default + - React-cxxreact (= 0.61.5) + - React-jsi (= 0.61.5) + - React-jsiexecutor (= 0.61.5) + - Yoga + - React-Core/RCTTextHeaders (0.61.5): + - Folly (= 2018.10.22.00) + - glog + - React-Core/Default + - React-cxxreact (= 0.61.5) + - React-jsi (= 0.61.5) + - React-jsiexecutor (= 0.61.5) + - Yoga + - React-Core/RCTVibrationHeaders (0.61.5): + - Folly (= 2018.10.22.00) + - glog + - React-Core/Default + - React-cxxreact (= 0.61.5) + - React-jsi (= 0.61.5) + - React-jsiexecutor (= 0.61.5) + - Yoga + - React-Core/RCTWebSocket (0.61.5): + - Folly (= 2018.10.22.00) + - glog + - React-Core/Default (= 0.61.5) + - React-cxxreact (= 0.61.5) + - React-jsi (= 0.61.5) + - React-jsiexecutor (= 0.61.5) + - Yoga + - React-CoreModules (0.61.5): + - FBReactNativeSpec (= 0.61.5) + - Folly (= 2018.10.22.00) + - RCTTypeSafety (= 0.61.5) + - React-Core/CoreModulesHeaders (= 0.61.5) + - React-RCTImage (= 0.61.5) + - ReactCommon/turbomodule/core (= 0.61.5) + - React-cxxreact (0.61.5): + - boost-for-react-native (= 1.63.0) + - DoubleConversion + - Folly (= 2018.10.22.00) + - glog + - React-jsinspector (= 0.61.5) + - React-jsi (0.61.5): + - boost-for-react-native (= 1.63.0) + - DoubleConversion + - Folly (= 2018.10.22.00) + - glog + - React-jsi/Default (= 0.61.5) + - React-jsi/Default (0.61.5): + - boost-for-react-native (= 1.63.0) + - DoubleConversion + - Folly (= 2018.10.22.00) + - glog + - React-jsiexecutor (0.61.5): + - DoubleConversion + - Folly (= 2018.10.22.00) + - glog + - React-cxxreact (= 0.61.5) + - React-jsi (= 0.61.5) + - React-jsinspector (0.61.5) + - react-native-video (5.1.0-alpha1): + - React + - react-native-video/Video (= 5.1.0-alpha1) + - react-native-video/Video (5.1.0-alpha1): + - GoogleAds-IMA-iOS-SDK (~> 3.9) + - React + - React-RCTActionSheet (0.61.5): + - React-Core/RCTActionSheetHeaders (= 0.61.5) + - React-RCTAnimation (0.61.5): + - React-Core/RCTAnimationHeaders (= 0.61.5) + - React-RCTBlob (0.61.5): + - React-Core/RCTBlobHeaders (= 0.61.5) + - React-Core/RCTWebSocket (= 0.61.5) + - React-jsi (= 0.61.5) + - React-RCTNetwork (= 0.61.5) + - React-RCTImage (0.61.5): + - React-Core/RCTImageHeaders (= 0.61.5) + - React-RCTNetwork (= 0.61.5) + - React-RCTLinking (0.61.5): + - React-Core/RCTLinkingHeaders (= 0.61.5) + - React-RCTNetwork (0.61.5): + - React-Core/RCTNetworkHeaders (= 0.61.5) + - React-RCTSettings (0.61.5): + - React-Core/RCTSettingsHeaders (= 0.61.5) + - React-RCTText (0.61.5): + - React-Core/RCTTextHeaders (= 0.61.5) + - React-RCTVibration (0.61.5): + - React-Core/RCTVibrationHeaders (= 0.61.5) + - ReactCommon/jscallinvoker (0.61.5): + - DoubleConversion + - Folly (= 2018.10.22.00) + - glog + - React-cxxreact (= 0.61.5) + - ReactCommon/turbomodule/core (0.61.5): + - DoubleConversion + - Folly (= 2018.10.22.00) + - glog + - React-Core (= 0.61.5) + - React-cxxreact (= 0.61.5) + - React-jsi (= 0.61.5) + - ReactCommon/jscallinvoker (= 0.61.5) + - Yoga (1.14.0) + +DEPENDENCIES: + - DoubleConversion (from `../node_modules/react-native/third-party-podspecs/DoubleConversion.podspec`) + - FBLazyVector (from `../node_modules/react-native/Libraries/FBLazyVector`) + - FBReactNativeSpec (from `../node_modules/react-native/Libraries/FBReactNativeSpec`) + - Folly (from `../node_modules/react-native/third-party-podspecs/Folly.podspec`) + - glog (from `../node_modules/react-native/third-party-podspecs/glog.podspec`) + - RCTRequired (from `../node_modules/react-native/Libraries/RCTRequired`) + - RCTTypeSafety (from `../node_modules/react-native/Libraries/TypeSafety`) + - React (from `../node_modules/react-native/`) + - React-Core (from `../node_modules/react-native/`) + - React-Core/DevSupport (from `../node_modules/react-native/`) + - React-Core/RCTWebSocket (from `../node_modules/react-native/`) + - React-CoreModules (from `../node_modules/react-native/React/CoreModules`) + - React-cxxreact (from `../node_modules/react-native/ReactCommon/cxxreact`) + - React-jsi (from `../node_modules/react-native/ReactCommon/jsi`) + - React-jsiexecutor (from `../node_modules/react-native/ReactCommon/jsiexecutor`) + - React-jsinspector (from `../node_modules/react-native/ReactCommon/jsinspector`) + - react-native-video (from `../node_modules/react-native-video`) + - React-RCTActionSheet (from `../node_modules/react-native/Libraries/ActionSheetIOS`) + - React-RCTAnimation (from `../node_modules/react-native/Libraries/NativeAnimation`) + - React-RCTBlob (from `../node_modules/react-native/Libraries/Blob`) + - React-RCTImage (from `../node_modules/react-native/Libraries/Image`) + - React-RCTLinking (from `../node_modules/react-native/Libraries/LinkingIOS`) + - React-RCTNetwork (from `../node_modules/react-native/Libraries/Network`) + - React-RCTSettings (from `../node_modules/react-native/Libraries/Settings`) + - React-RCTText (from `../node_modules/react-native/Libraries/Text`) + - React-RCTVibration (from `../node_modules/react-native/Libraries/Vibration`) + - ReactCommon/jscallinvoker (from `../node_modules/react-native/ReactCommon`) + - ReactCommon/turbomodule/core (from `../node_modules/react-native/ReactCommon`) + - Yoga (from `../node_modules/react-native/ReactCommon/yoga`) + +SPEC REPOS: + trunk: + - boost-for-react-native + - GoogleAds-IMA-iOS-SDK + +EXTERNAL SOURCES: + DoubleConversion: + :podspec: "../node_modules/react-native/third-party-podspecs/DoubleConversion.podspec" + FBLazyVector: + :path: "../node_modules/react-native/Libraries/FBLazyVector" + FBReactNativeSpec: + :path: "../node_modules/react-native/Libraries/FBReactNativeSpec" + Folly: + :podspec: "../node_modules/react-native/third-party-podspecs/Folly.podspec" + glog: + :podspec: "../node_modules/react-native/third-party-podspecs/glog.podspec" + RCTRequired: + :path: "../node_modules/react-native/Libraries/RCTRequired" + RCTTypeSafety: + :path: "../node_modules/react-native/Libraries/TypeSafety" + React: + :path: "../node_modules/react-native/" + React-Core: + :path: "../node_modules/react-native/" + React-CoreModules: + :path: "../node_modules/react-native/React/CoreModules" + React-cxxreact: + :path: "../node_modules/react-native/ReactCommon/cxxreact" + React-jsi: + :path: "../node_modules/react-native/ReactCommon/jsi" + React-jsiexecutor: + :path: "../node_modules/react-native/ReactCommon/jsiexecutor" + React-jsinspector: + :path: "../node_modules/react-native/ReactCommon/jsinspector" + react-native-video: + :path: "../node_modules/react-native-video" + React-RCTActionSheet: + :path: "../node_modules/react-native/Libraries/ActionSheetIOS" + React-RCTAnimation: + :path: "../node_modules/react-native/Libraries/NativeAnimation" + React-RCTBlob: + :path: "../node_modules/react-native/Libraries/Blob" + React-RCTImage: + :path: "../node_modules/react-native/Libraries/Image" + React-RCTLinking: + :path: "../node_modules/react-native/Libraries/LinkingIOS" + React-RCTNetwork: + :path: "../node_modules/react-native/Libraries/Network" + React-RCTSettings: + :path: "../node_modules/react-native/Libraries/Settings" + React-RCTText: + :path: "../node_modules/react-native/Libraries/Text" + React-RCTVibration: + :path: "../node_modules/react-native/Libraries/Vibration" + ReactCommon: + :path: "../node_modules/react-native/ReactCommon" + Yoga: + :path: "../node_modules/react-native/ReactCommon/yoga" + +SPEC CHECKSUMS: + boost-for-react-native: 39c7adb57c4e60d6c5479dd8623128eb5b3f0f2c + DoubleConversion: 5805e889d232975c086db112ece9ed034df7a0b2 + FBLazyVector: aaeaf388755e4f29cd74acbc9e3b8da6d807c37f + FBReactNativeSpec: 118d0d177724c2d67f08a59136eb29ef5943ec75 + Folly: 30e7936e1c45c08d884aa59369ed951a8e68cf51 + glog: 1f3da668190260b06b429bb211bfbee5cd790c28 + GoogleAds-IMA-iOS-SDK: 0e37ab83b22075ad631a70dcba9528cb246c92bf + RCTRequired: b153add4da6e7dbc44aebf93f3cf4fcae392ddf1 + RCTTypeSafety: 9aa1b91d7f9310fc6eadc3cf95126ffe818af320 + React: b6a59ef847b2b40bb6e0180a97d0ca716969ac78 + React-Core: 688b451f7d616cc1134ac95295b593d1b5158a04 + React-CoreModules: d04f8494c1a328b69ec11db9d1137d667f916dcb + React-cxxreact: d0f7bcafa196ae410e5300736b424455e7fb7ba7 + React-jsi: cb2cd74d7ccf4cffb071a46833613edc79cdf8f7 + React-jsiexecutor: d5525f9ed5f782fdbacb64b9b01a43a9323d2386 + React-jsinspector: fa0ecc501688c3c4c34f28834a76302233e29dc0 + react-native-video: c3bf083971eafe6db2cf301636694f83bb012430 + React-RCTActionSheet: 600b4d10e3aea0913b5a92256d2719c0cdd26d76 + React-RCTAnimation: 791a87558389c80908ed06cc5dfc5e7920dfa360 + React-RCTBlob: d89293cc0236d9cb0933d85e430b0bbe81ad1d72 + React-RCTImage: 6b8e8df449eb7c814c99a92d6b52de6fe39dea4e + React-RCTLinking: 121bb231c7503cf9094f4d8461b96a130fabf4a5 + React-RCTNetwork: fb353640aafcee84ca8b78957297bd395f065c9a + React-RCTSettings: 8db258ea2a5efee381fcf7a6d5044e2f8b68b640 + React-RCTText: 9ccc88273e9a3aacff5094d2175a605efa854dbe + React-RCTVibration: a49a1f42bf8f5acf1c3e297097517c6b3af377ad + ReactCommon: 198c7c8d3591f975e5431bec1b0b3b581aa1c5dd + Yoga: f2a7cd4280bfe2cca5a7aed98ba0eb3d1310f18b + +PODFILE CHECKSUM: ff44b40df452c2410ba8c86ff1d981c586cc6286 + +COCOAPODS: 1.8.4 diff --git a/examples/basic/ios/VideoPlayer.xcodeproj/project.pbxproj b/examples/basic/ios/VideoPlayer.xcodeproj/project.pbxproj index 91e4e3a0cf..be579062a0 100644 --- a/examples/basic/ios/VideoPlayer.xcodeproj/project.pbxproj +++ b/examples/basic/ios/VideoPlayer.xcodeproj/project.pbxproj @@ -7,22 +7,12 @@ objects = { /* Begin PBXBuildFile section */ - 00C302E51ABCBA2D00DB3ED1 /* libRCTActionSheet.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 00C302AC1ABCB8CE00DB3ED1 /* libRCTActionSheet.a */; }; - 00C302E71ABCBA2D00DB3ED1 /* libRCTGeolocation.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 00C302BA1ABCB90400DB3ED1 /* libRCTGeolocation.a */; }; - 00C302E81ABCBA2D00DB3ED1 /* libRCTImage.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 00C302C01ABCB91800DB3ED1 /* libRCTImage.a */; }; - 00C302E91ABCBA2D00DB3ED1 /* libRCTNetwork.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 00C302DC1ABCB9D200DB3ED1 /* libRCTNetwork.a */; }; - 00C302EA1ABCBA2D00DB3ED1 /* libRCTVibration.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 00C302E41ABCB9EE00DB3ED1 /* libRCTVibration.a */; }; - 133E29F31AD74F7200F7D852 /* libRCTLinking.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 78C398B91ACF4ADC00677621 /* libRCTLinking.a */; }; - 139105C61AF99C1200B5F7CC /* libRCTSettings.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 139105C11AF99BAD00B5F7CC /* libRCTSettings.a */; }; - 139FDEF61B0652A700C62182 /* libRCTWebSocket.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 139FDEF41B06529B00C62182 /* libRCTWebSocket.a */; }; 13B07FBC1A68108700A75B9A /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 13B07FB01A68108700A75B9A /* AppDelegate.m */; }; 13B07FBD1A68108700A75B9A /* LaunchScreen.xib in Resources */ = {isa = PBXBuildFile; fileRef = 13B07FB11A68108700A75B9A /* LaunchScreen.xib */; }; 13B07FBF1A68108700A75B9A /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 13B07FB51A68108700A75B9A /* Images.xcassets */; }; 13B07FC11A68108700A75B9A /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 13B07FB71A68108700A75B9A /* main.m */; }; - 146834051AC3E58100842450 /* libReact.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 146834041AC3E56700842450 /* libReact.a */; }; - 5E9157361DD0AC6A00FF2AA8 /* libRCTAnimation.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 5E9157331DD0AC6500FF2AA8 /* libRCTAnimation.a */; }; - 832341BD1AAA6AB300B99B32 /* libRCTText.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 832341B51AAA6A8300B99B32 /* libRCTText.a */; }; - 8C2A0F841E2560A100E31596 /* libRCTVideo.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 8C2A0F791E25608300E31596 /* libRCTVideo.a */; }; + 35038EB1239F5C8E004C7F58 /* Pods_VideoPlayer.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 35038EB0239F5C8E004C7F58 /* Pods_VideoPlayer.framework */; }; + 3E565D7A54028115524E19B3 /* Pods_VideoPlayer_tvOS.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E283EDD1CBBEDE14319F393C /* Pods_VideoPlayer_tvOS.framework */; }; FA3566AB216D5D7000E01ABD /* libRCTImage-tvOS.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 3DAD3E841DF850E9000B6D8A /* libRCTImage-tvOS.a */; }; FA3566AC216D5D7000E01ABD /* libRCTLinking-tvOS.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 3DAD3E881DF850E9000B6D8A /* libRCTLinking-tvOS.a */; }; FA3566AD216D5D7000E01ABD /* libRCTNetwork-tvOS.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 3DAD3E8C1DF850E9000B6D8A /* libRCTNetwork-tvOS.a */; }; @@ -315,12 +305,20 @@ 13B07FB61A68108700A75B9A /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.xml; name = Info.plist; path = VideoPlayer/Info.plist; sourceTree = ""; }; 13B07FB71A68108700A75B9A /* main.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; name = main.m; path = VideoPlayer/main.m; sourceTree = ""; }; 146833FF1AC3E56700842450 /* React.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = React.xcodeproj; path = "../node_modules/react-native/React/React.xcodeproj"; sourceTree = ""; }; + 193C56737A4BFE22EC8FD7CE /* Pods-VideoPlayer-tvOS.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-VideoPlayer-tvOS.release.xcconfig"; path = "Target Support Files/Pods-VideoPlayer-tvOS/Pods-VideoPlayer-tvOS.release.xcconfig"; sourceTree = ""; }; + 35038EAE239F5C29004C7F58 /* React.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = React.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 35038EB0239F5C8E004C7F58 /* Pods_VideoPlayer.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = Pods_VideoPlayer.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 39CBB10045CEBFA9BBB9645E /* libPods-VideoPlayer.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-VideoPlayer.a"; sourceTree = BUILT_PRODUCTS_DIR; }; + 49F6E2DFCFB5662A09E3B94F /* Pods-VideoPlayer.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-VideoPlayer.release.xcconfig"; path = "Target Support Files/Pods-VideoPlayer/Pods-VideoPlayer.release.xcconfig"; sourceTree = ""; }; + 52421E8587B432062FCB0E39 /* Pods-VideoPlayer-tvOS.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-VideoPlayer-tvOS.debug.xcconfig"; path = "Target Support Files/Pods-VideoPlayer-tvOS/Pods-VideoPlayer-tvOS.debug.xcconfig"; sourceTree = ""; }; 5E91572D1DD0AC6500FF2AA8 /* RCTAnimation.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RCTAnimation.xcodeproj; path = "../node_modules/react-native/Libraries/NativeAnimation/RCTAnimation.xcodeproj"; sourceTree = ""; }; 627363E07276C06249D7CEBF /* libPods-VideoPlayer-tvOS.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = "libPods-VideoPlayer-tvOS.a"; sourceTree = BUILT_PRODUCTS_DIR; }; 78C398B01ACF4ADC00677621 /* RCTLinking.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RCTLinking.xcodeproj; path = "../node_modules/react-native/Libraries/LinkingIOS/RCTLinking.xcodeproj"; sourceTree = ""; }; 832341B01AAA6A8300B99B32 /* RCTText.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RCTText.xcodeproj; path = "../node_modules/react-native/Libraries/Text/RCTText.xcodeproj"; sourceTree = ""; }; 8C2A0F651E25608300E31596 /* RCTVideo.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = RCTVideo.xcodeproj; path = "../node_modules/react-native-video/ios/RCTVideo.xcodeproj"; sourceTree = ""; }; + B4E8B7269229AE0B24D2F9C2 /* Pods_VideoPlayer.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_VideoPlayer.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + B6DC2FE9CFD02FF649339B93 /* Pods-VideoPlayer.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-VideoPlayer.debug.xcconfig"; path = "Target Support Files/Pods-VideoPlayer/Pods-VideoPlayer.debug.xcconfig"; sourceTree = ""; }; + E283EDD1CBBEDE14319F393C /* Pods_VideoPlayer_tvOS.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_VideoPlayer_tvOS.framework; sourceTree = BUILT_PRODUCTS_DIR; }; FA8681CE216D5C6D0010C92A /* VideoPlayer-tvOS.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "VideoPlayer-tvOS.app"; sourceTree = BUILT_PRODUCTS_DIR; }; FA8681D0216D5C6E0010C92A /* VideoPlayer-tvOS.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; name = "VideoPlayer-tvOS.plist"; path = "/Users/amishra/Development/react-native-video-nfb/examples/basic/ios/VideoPlayer-tvOS.plist"; sourceTree = ""; }; /* End PBXFileReference section */ @@ -330,18 +328,7 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 146834051AC3E58100842450 /* libReact.a in Frameworks */, - 5E9157361DD0AC6A00FF2AA8 /* libRCTAnimation.a in Frameworks */, - 8C2A0F841E2560A100E31596 /* libRCTVideo.a in Frameworks */, - 00C302E51ABCBA2D00DB3ED1 /* libRCTActionSheet.a in Frameworks */, - 00C302E71ABCBA2D00DB3ED1 /* libRCTGeolocation.a in Frameworks */, - 00C302E81ABCBA2D00DB3ED1 /* libRCTImage.a in Frameworks */, - 133E29F31AD74F7200F7D852 /* libRCTLinking.a in Frameworks */, - 00C302E91ABCBA2D00DB3ED1 /* libRCTNetwork.a in Frameworks */, - 139105C61AF99C1200B5F7CC /* libRCTSettings.a in Frameworks */, - 832341BD1AAA6AB300B99B32 /* libRCTText.a in Frameworks */, - 00C302EA1ABCBA2D00DB3ED1 /* libRCTVibration.a in Frameworks */, - 139FDEF61B0652A700C62182 /* libRCTWebSocket.a in Frameworks */, + 35038EB1239F5C8E004C7F58 /* Pods_VideoPlayer.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -357,6 +344,7 @@ FA3566AF216D5D7000E01ABD /* libRCTText-tvOS.a in Frameworks */, FA3566B0216D5D7000E01ABD /* libRCTWebSocket-tvOS.a in Frameworks */, FA3566C8216D5DA900E01ABD /* libRCTVideo.a in Frameworks */, + 3E565D7A54028115524E19B3 /* Pods_VideoPlayer_tvOS.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -516,6 +504,7 @@ 832341AE1AAA6A7D00B99B32 /* Libraries */, 83CBBA001A601CBA00E9B192 /* Products */, FA35669C216D5D7000E01ABD /* Frameworks */, + BB30D76686EC7F53F239F9B8 /* Pods */, ); indentWidth = 2; sourceTree = ""; @@ -539,11 +528,26 @@ name = Products; sourceTree = ""; }; + BB30D76686EC7F53F239F9B8 /* Pods */ = { + isa = PBXGroup; + children = ( + B6DC2FE9CFD02FF649339B93 /* Pods-VideoPlayer.debug.xcconfig */, + 49F6E2DFCFB5662A09E3B94F /* Pods-VideoPlayer.release.xcconfig */, + 52421E8587B432062FCB0E39 /* Pods-VideoPlayer-tvOS.debug.xcconfig */, + 193C56737A4BFE22EC8FD7CE /* Pods-VideoPlayer-tvOS.release.xcconfig */, + ); + path = Pods; + sourceTree = ""; + }; FA35669C216D5D7000E01ABD /* Frameworks */ = { isa = PBXGroup; children = ( + 35038EB0239F5C8E004C7F58 /* Pods_VideoPlayer.framework */, + 35038EAE239F5C29004C7F58 /* React.framework */, 39CBB10045CEBFA9BBB9645E /* libPods-VideoPlayer.a */, 627363E07276C06249D7CEBF /* libPods-VideoPlayer-tvOS.a */, + B4E8B7269229AE0B24D2F9C2 /* Pods_VideoPlayer.framework */, + E283EDD1CBBEDE14319F393C /* Pods_VideoPlayer_tvOS.framework */, ); name = Frameworks; sourceTree = ""; @@ -563,10 +567,12 @@ isa = PBXNativeTarget; buildConfigurationList = 13B07F931A680F5B00A75B9A /* Build configuration list for PBXNativeTarget "VideoPlayer" */; buildPhases = ( + 32CB69FF947AEF78D0E22CF5 /* [CP] Check Pods Manifest.lock */, 13B07F871A680F5B00A75B9A /* Sources */, 13B07F8C1A680F5B00A75B9A /* Frameworks */, 13B07F8E1A680F5B00A75B9A /* Resources */, 00DD1BFF1BD5951E006B06BC /* Bundle React Native code and images */, + 32F3757568F2420976252267 /* [CP] Embed Pods Frameworks */, ); buildRules = ( ); @@ -581,6 +587,7 @@ isa = PBXNativeTarget; buildConfigurationList = FA8681CB216D5C6D0010C92A /* Build configuration list for PBXNativeTarget "VideoPlayer-tvOS" */; buildPhases = ( + 629EB3CAFD1669F3677B304B /* [CP] Check Pods Manifest.lock */, FA8681B7216D5C6D0010C92A /* Sources */, FA8681BA216D5C6D0010C92A /* Frameworks */, FA8681C7216D5C6D0010C92A /* Resources */, @@ -609,6 +616,7 @@ developmentRegion = English; hasScannedForEncodings = 0; knownRegions = ( + English, en, Base, ); @@ -970,6 +978,112 @@ shellPath = /bin/sh; shellScript = "export NODE_BINARY=node\n../node_modules/react-native/scripts/react-native-xcode.sh\n"; }; + 32CB69FF947AEF78D0E22CF5 /* [CP] Check Pods Manifest.lock */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + ); + inputPaths = ( + "${PODS_PODFILE_DIR_PATH}/Podfile.lock", + "${PODS_ROOT}/Manifest.lock", + ); + name = "[CP] Check Pods Manifest.lock"; + outputFileListPaths = ( + ); + outputPaths = ( + "$(DERIVED_FILE_DIR)/Pods-VideoPlayer-checkManifestLockResult.txt", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; + showEnvVarsInLog = 0; + }; + 32F3757568F2420976252267 /* [CP] Embed Pods Frameworks */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + "${PODS_ROOT}/Target Support Files/Pods-VideoPlayer/Pods-VideoPlayer-frameworks.sh", + "${BUILT_PRODUCTS_DIR}/DoubleConversion/DoubleConversion.framework", + "${BUILT_PRODUCTS_DIR}/FBReactNativeSpec/FBReactNativeSpec.framework", + "${BUILT_PRODUCTS_DIR}/Folly/folly.framework", + "${PODS_ROOT}/GoogleAds-IMA-iOS-SDK/GoogleInteractiveMediaAds.framework", + "${BUILT_PRODUCTS_DIR}/RCTTypeSafety/RCTTypeSafety.framework", + "${BUILT_PRODUCTS_DIR}/React-Core/React.framework", + "${BUILT_PRODUCTS_DIR}/React-CoreModules/CoreModules.framework", + "${BUILT_PRODUCTS_DIR}/React-RCTActionSheet/RCTActionSheet.framework", + "${BUILT_PRODUCTS_DIR}/React-RCTAnimation/RCTAnimation.framework", + "${BUILT_PRODUCTS_DIR}/React-RCTBlob/RCTBlob.framework", + "${BUILT_PRODUCTS_DIR}/React-RCTImage/RCTImage.framework", + "${BUILT_PRODUCTS_DIR}/React-RCTLinking/RCTLinking.framework", + "${BUILT_PRODUCTS_DIR}/React-RCTNetwork/RCTNetwork.framework", + "${BUILT_PRODUCTS_DIR}/React-RCTSettings/RCTSettings.framework", + "${BUILT_PRODUCTS_DIR}/React-RCTText/RCTText.framework", + "${BUILT_PRODUCTS_DIR}/React-RCTVibration/RCTVibration.framework", + "${BUILT_PRODUCTS_DIR}/React-cxxreact/cxxreact.framework", + "${BUILT_PRODUCTS_DIR}/React-jsi/jsi.framework", + "${BUILT_PRODUCTS_DIR}/React-jsiexecutor/jsireact.framework", + "${BUILT_PRODUCTS_DIR}/React-jsinspector/jsinspector.framework", + "${BUILT_PRODUCTS_DIR}/ReactCommon/ReactCommon.framework", + "${BUILT_PRODUCTS_DIR}/Yoga/yoga.framework", + "${BUILT_PRODUCTS_DIR}/glog/glog.framework", + ); + name = "[CP] Embed Pods Frameworks"; + outputPaths = ( + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/DoubleConversion.framework", + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/FBReactNativeSpec.framework", + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/folly.framework", + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/GoogleInteractiveMediaAds.framework", + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/RCTTypeSafety.framework", + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/React.framework", + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/CoreModules.framework", + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/RCTActionSheet.framework", + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/RCTAnimation.framework", + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/RCTBlob.framework", + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/RCTImage.framework", + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/RCTLinking.framework", + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/RCTNetwork.framework", + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/RCTSettings.framework", + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/RCTText.framework", + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/RCTVibration.framework", + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/cxxreact.framework", + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/jsi.framework", + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/jsireact.framework", + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/jsinspector.framework", + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/ReactCommon.framework", + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/yoga.framework", + "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/glog.framework", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-VideoPlayer/Pods-VideoPlayer-frameworks.sh\"\n"; + showEnvVarsInLog = 0; + }; + 629EB3CAFD1669F3677B304B /* [CP] Check Pods Manifest.lock */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputFileListPaths = ( + ); + inputPaths = ( + "${PODS_PODFILE_DIR_PATH}/Podfile.lock", + "${PODS_ROOT}/Manifest.lock", + ); + name = "[CP] Check Pods Manifest.lock"; + outputFileListPaths = ( + ); + outputPaths = ( + "$(DERIVED_FILE_DIR)/Pods-VideoPlayer-tvOS-checkManifestLockResult.txt", + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/sh; + shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; + showEnvVarsInLog = 0; + }; FA8681CA216D5C6D0010C92A /* Bundle React Native code and images */ = { isa = PBXShellScriptBuildPhase; buildActionMask = 2147483647; @@ -1022,6 +1136,7 @@ /* Begin XCBuildConfiguration section */ 13B07F941A680F5B00A75B9A /* Debug */ = { isa = XCBuildConfiguration; + baseConfigurationReference = B6DC2FE9CFD02FF649339B93 /* Pods-VideoPlayer.debug.xcconfig */; buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CURRENT_PROJECT_VERSION = 1; @@ -1041,6 +1156,7 @@ }; 13B07F951A680F5B00A75B9A /* Release */ = { isa = XCBuildConfiguration; + baseConfigurationReference = 49F6E2DFCFB5662A09E3B94F /* Pods-VideoPlayer.release.xcconfig */; buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CURRENT_PROJECT_VERSION = 1; @@ -1135,6 +1251,7 @@ }; FA8681CC216D5C6D0010C92A /* Debug */ = { isa = XCBuildConfiguration; + baseConfigurationReference = 52421E8587B432062FCB0E39 /* Pods-VideoPlayer-tvOS.debug.xcconfig */; buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CURRENT_PROJECT_VERSION = 1; @@ -1158,6 +1275,7 @@ }; FA8681CD216D5C6D0010C92A /* Release */ = { isa = XCBuildConfiguration; + baseConfigurationReference = 193C56737A4BFE22EC8FD7CE /* Pods-VideoPlayer-tvOS.release.xcconfig */; buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; CURRENT_PROJECT_VERSION = 1; diff --git a/examples/basic/yarn.lock b/examples/basic/yarn.lock index 50d8d52e56..fc394997b5 100644 --- a/examples/basic/yarn.lock +++ b/examples/basic/yarn.lock @@ -836,12 +836,19 @@ "@types/istanbul-reports" "^1.1.1" "@types/yargs" "^13.0.0" -"@react-native-community/cli-platform-android@^2.6.0", "@react-native-community/cli-platform-android@^2.9.0": - version "2.9.0" - resolved "https://registry.yarnpkg.com/@react-native-community/cli-platform-android/-/cli-platform-android-2.9.0.tgz#28831e61ce565a2c7d1905852fce1eecfd33cb5e" - integrity sha512-VEQs4Q6R5tnlYFrQIFoPEWjLc43whRHC9HeH+idbFymwDqysLVUffQbb9D6PJUj+C/AvrDhBhU6S3tDjGbSsag== +"@react-native-community/cli-debugger-ui@^3.0.0": + version "3.0.0" + resolved "https://registry.yarnpkg.com/@react-native-community/cli-debugger-ui/-/cli-debugger-ui-3.0.0.tgz#d01d08d1e5ddc1633d82c7d84d48fff07bd39416" + integrity sha512-m3X+iWLsK/H7/b7PpbNO33eQayR/+M26la4ZbYe1KRke5Umg4PIWsvg21O8Tw4uJcY8LA5hsP+rBi/syBkBf0g== dependencies: - "@react-native-community/cli-tools" "^2.8.3" + serve-static "^1.13.1" + +"@react-native-community/cli-platform-android@^3.0.0": + version "3.0.3" + resolved "https://registry.yarnpkg.com/@react-native-community/cli-platform-android/-/cli-platform-android-3.0.3.tgz#e652abce79a7c1e3a8280228123e99df2c4b97b6" + integrity sha512-rNO9DmRiVhB6aP2DVUjEJv7ecriTARDZND88ny3xNVUkrD1Y+zwF6aZu3eoT52VXOxLCSLiJzz19OiyGmfqxYg== + dependencies: + "@react-native-community/cli-tools" "^3.0.0" chalk "^2.4.2" execa "^1.0.0" jetifier "^1.6.2" @@ -849,35 +856,42 @@ slash "^3.0.0" xmldoc "^1.1.2" -"@react-native-community/cli-platform-ios@^2.4.1", "@react-native-community/cli-platform-ios@^2.9.0": - version "2.9.0" - resolved "https://registry.yarnpkg.com/@react-native-community/cli-platform-ios/-/cli-platform-ios-2.9.0.tgz#21adb8ee813d6ca6fd9d4d9be63f92024f7e2fe7" - integrity sha512-vg6EOamtFaaQ02FiWu+jzJTfeTJ0OVjJSAoR2rhJKNye6RgJLoQlfp0Hg3waF6XrO72a7afYZsPdKSlN3ewlHg== +"@react-native-community/cli-platform-ios@^3.0.0": + version "3.0.0" + resolved "https://registry.yarnpkg.com/@react-native-community/cli-platform-ios/-/cli-platform-ios-3.0.0.tgz#3a48a449c0c33af3b0b3d19d3256de99388fe15f" + integrity sha512-QoNVlDj8eMXRZk9uktPFsctHurQpv9jKmiu6mQii4NEtT2npE7g1hbWpRNojutBsfgmCdQGDHd9uB54eeCnYgg== dependencies: - "@react-native-community/cli-tools" "^2.8.3" + "@react-native-community/cli-tools" "^3.0.0" chalk "^2.4.2" + js-yaml "^3.13.1" xcode "^2.0.0" -"@react-native-community/cli-tools@^2.8.3": - version "2.8.3" - resolved "https://registry.yarnpkg.com/@react-native-community/cli-tools/-/cli-tools-2.8.3.tgz#0e2249f48cf4603fb8d740a9f0715c31ac131ceb" - integrity sha512-N5Pz+pR+GFq3JApjd0SW4jp9KC7kbKsMH65QLRh30JNsxdPvNkYox6/ZZdkvdXaI5ev3EckR7eqlcwi5gpVTYQ== +"@react-native-community/cli-tools@^3.0.0": + version "3.0.0" + resolved "https://registry.yarnpkg.com/@react-native-community/cli-tools/-/cli-tools-3.0.0.tgz#fe48b80822ed7e49b8af051f9fe41e22a2a710b1" + integrity sha512-8IhQKZdf3E4CR8T7HhkPGgorot/cLkRDgneJFDSWk/wCYZAuUh4NEAdumQV7N0jLSMWX7xxiWUPi94lOBxVY9g== dependencies: chalk "^2.4.2" lodash "^4.17.5" mime "^2.4.1" node-fetch "^2.5.0" -"@react-native-community/cli@^2.6.0": - version "2.9.0" - resolved "https://registry.yarnpkg.com/@react-native-community/cli/-/cli-2.9.0.tgz#f0d18dc3e5a8f68e3d6ad353c444dc2f08d3fbdc" - integrity sha512-6TYkrR1pwIEPpiPZnOYscCGr5Xh8RijqBPVAOGTaEdpQQpc/J7GDPrePwbyTzwmCPtiK6XT+T5+1AiAK5bz/sw== +"@react-native-community/cli-types@^3.0.0": + version "3.0.0" + resolved "https://registry.yarnpkg.com/@react-native-community/cli-types/-/cli-types-3.0.0.tgz#488d46605cb05e88537e030f38da236eeda74652" + integrity sha512-ng6Tm537E/M42GjE4TRUxQyL8sRfClcL7bQWblOCoxPZzJ2J3bdALsjeG3vDnVCIfI/R0AeFalN9KjMt0+Z/Zg== + +"@react-native-community/cli@^3.0.0": + version "3.0.4" + resolved "https://registry.yarnpkg.com/@react-native-community/cli/-/cli-3.0.4.tgz#a9dba1bc77855a6e45fccaabb017360645d936bb" + integrity sha512-kt+ENtC+eRUSfWPbbpx3r7fAQDcFwgM03VW/lBdVAUjkNxffPFT2GGdK23CJSBOXTjRSiGuwhvwH4Z28PdrlRA== dependencies: "@hapi/joi" "^15.0.3" - "@react-native-community/cli-platform-android" "^2.9.0" - "@react-native-community/cli-platform-ios" "^2.9.0" - "@react-native-community/cli-tools" "^2.8.3" + "@react-native-community/cli-debugger-ui" "^3.0.0" + "@react-native-community/cli-tools" "^3.0.0" + "@react-native-community/cli-types" "^3.0.0" chalk "^2.4.2" + command-exists "^1.2.8" commander "^2.19.0" compression "^1.7.1" connect "^3.6.5" @@ -886,15 +900,16 @@ envinfo "^7.1.0" errorhandler "^1.5.0" execa "^1.0.0" + find-up "^4.1.0" fs-extra "^7.0.1" glob "^7.1.1" graceful-fs "^4.1.3" inquirer "^3.0.6" lodash "^4.17.5" - metro "^0.54.1" - metro-config "^0.54.1" - metro-core "^0.54.1" - metro-react-native-babel-transformer "^0.54.1" + metro "^0.56.0" + metro-config "^0.56.0" + metro-core "^0.56.0" + metro-react-native-babel-transformer "^0.56.0" minimist "^1.2.0" mkdirp "^0.5.1" morgan "^1.9.0" @@ -902,9 +917,12 @@ open "^6.2.0" ora "^3.4.0" plist "^3.0.0" - semver "^5.0.3" + semver "^6.3.0" serve-static "^1.13.1" shell-quote "1.6.1" + strip-ansi "^5.2.0" + sudo-prompt "^9.0.0" + wcwidth "^1.0.1" ws "^1.1.0" "@react-native-community/eslint-config@^0.0.5": @@ -1764,6 +1782,11 @@ combined-stream@^1.0.6, combined-stream@~1.0.6: dependencies: delayed-stream "~1.0.0" +command-exists@^1.2.8: + version "1.2.8" + resolved "https://registry.yarnpkg.com/command-exists/-/command-exists-1.2.8.tgz#715acefdd1223b9c9b37110a149c6392c2852291" + integrity sha512-PM54PkseWbiiD/mMsbvW351/u+dafwTJ0ye2qB60G1aGQP9j3xK2gmMDc+R34L3nDtx4qMCitXT75mkbkGJDLw== + commander@^2.19.0, commander@~2.20.0: version "2.20.0" resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.0.tgz#d58bb2b5c1ee8f87b0d340027e9e94e222c5a422" @@ -2072,10 +2095,6 @@ doctrine@^3.0.0: dependencies: esutils "^2.0.2" -dom-walk@^0.1.0: - version "0.1.1" - resolved "https://registry.yarnpkg.com/dom-walk/-/dom-walk-0.1.1.tgz#672226dc74c8f799ad35307df936aba11acd6018" - domexception@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/domexception/-/domexception-1.0.1.tgz#937442644ca6a31261ef36e3ec677fe805582c90" @@ -2665,6 +2684,14 @@ find-up@^3.0.0: dependencies: locate-path "^3.0.0" +find-up@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-4.1.0.tgz#97afe7d6cdc0bc5928584b7c8d7b16e8a9aa5d19" + integrity sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw== + dependencies: + locate-path "^5.0.0" + path-exists "^4.0.0" + flat-cache@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-2.0.1.tgz#5d296d6f04bda44a4630a301413bdbc2ec085ec0" @@ -2831,13 +2858,6 @@ glob@^7.1.1, glob@^7.1.2, glob@^7.1.3: once "^1.3.0" path-is-absolute "^1.0.0" -global@^4.3.0: - version "4.3.1" - resolved "https://registry.yarnpkg.com/global/-/global-4.3.1.tgz#5f757908c7cbabce54f386ae440e11e26b7916df" - dependencies: - min-document "^2.19.0" - process "~0.5.1" - globals@^11.1.0, globals@^11.7.0: version "11.12.0" resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e" @@ -2933,10 +2953,10 @@ has@^1.0.1, has@^1.0.3: dependencies: function-bind "^1.1.1" -hermesvm@^0.1.0: - version "0.1.1" - resolved "https://registry.yarnpkg.com/hermesvm/-/hermesvm-0.1.1.tgz#bd1df92b4dc504e261c23df34864daf24b844d03" - integrity sha512-EosSDeUqTTGvlc9vQiy5Y/9GBlucEyo6lYuxg/FnukHCD/CP3NYeDAGV54TyZ19FgSqMEoPgOH9cyxvv8epQ1g== +hermes-engine@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/hermes-engine/-/hermes-engine-0.2.1.tgz#25c0f1ff852512a92cb5c5cc47cf967e1e722ea2" + integrity sha512-eNHUQHuadDMJARpaqvlCZoK/Nitpj6oywq3vQ3wCwEsww5morX34mW5PmKWQTO7aU0ck0hgulxR+EVDlXygGxQ== hosted-git-info@^2.1.4: version "2.2.0" @@ -3752,7 +3772,7 @@ jsbn@~0.1.0: version "0.1.1" resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513" -jsc-android@245459.0.0: +jsc-android@^245459.0.0: version "245459.0.0" resolved "https://registry.yarnpkg.com/jsc-android/-/jsc-android-245459.0.0.tgz#e584258dd0b04c9159a27fb104cd5d491fd202c9" integrity sha512-wkjURqwaB1daNkDi2OYYbsLnIdC/lUM2nPXQKRs5pqEU9chDg435bjvo+LSaHotDENygHQDHe+ntUkkw2gwMtg== @@ -3985,6 +4005,13 @@ locate-path@^3.0.0: p-locate "^3.0.0" path-exists "^3.0.0" +locate-path@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-5.0.0.tgz#1afba396afd676a6d42504d0a67a3a7eb9f62aa0" + integrity sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g== + dependencies: + p-locate "^4.1.0" + lodash.sortby@^4.7.0: version "4.7.0" resolved "https://registry.yarnpkg.com/lodash.sortby/-/lodash.sortby-4.7.0.tgz#edd14c824e2cc9c1e0b0a1b42bb5210516a42438" @@ -4010,7 +4037,7 @@ lodash@^4.17.11, lodash@^4.17.5: resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.11.tgz#b39ea6229ef607ecd89e2c8df12536891cac9b8d" integrity sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg== -lodash@^4.3.0, lodash@^4.6.1: +lodash@^4.3.0: version "4.17.4" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.4.tgz#78203a4d1c328ae1d86dca6460e369b57f4055ae" @@ -4111,10 +4138,10 @@ merge-stream@^2.0.0: resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60" integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w== -metro-babel-register@0.54.1: - version "0.54.1" - resolved "https://registry.yarnpkg.com/metro-babel-register/-/metro-babel-register-0.54.1.tgz#7d2bfe444b1ccef8de99aedc7d9330891d806076" - integrity sha512-j3VydgncUG8HP6AZala6GTIt3V01nptodnnOke3JMYLqgk8EJ1LOVOdotK9pXi80o7EmmNKFs/LyyH8z+uAJzQ== +metro-babel-register@0.56.3, metro-babel-register@^0.56.0: + version "0.56.3" + resolved "https://registry.yarnpkg.com/metro-babel-register/-/metro-babel-register-0.56.3.tgz#d0cfb38adf45cb35965649ede794f2308562e20f" + integrity sha512-ILCRtNFdW6vzqmLAG2MYWdTSE1vCAZqDKNggiNhlfViuoxmWAIL0vOqixl1CHZF5z4t55+fk46A0jSN7UgPyVw== dependencies: "@babel/core" "^7.0.0" "@babel/plugin-proposal-class-properties" "^7.0.0" @@ -4129,56 +4156,50 @@ metro-babel-register@0.54.1: core-js "^2.2.2" escape-string-regexp "^1.0.5" -metro-babel-transformer@0.54.1: - version "0.54.1" - resolved "https://registry.yarnpkg.com/metro-babel-transformer/-/metro-babel-transformer-0.54.1.tgz#371ffa2d1118b22cc9e40b3c3ea6738c49dae9dc" - integrity sha512-2aiAnuYBdcLV1VINb8ENAA4keIaJIepHgR9+iRvIde+9GSjKnexqx4nNmJN392285gRDp1fVZ7uY0uQawK/A5g== +metro-babel-transformer@0.56.3: + version "0.56.3" + resolved "https://registry.yarnpkg.com/metro-babel-transformer/-/metro-babel-transformer-0.56.3.tgz#6559c3a8565238a704a181353cef59fdb974e6db" + integrity sha512-N5/ftb3rBkt6uKlgYAv+lwtzYc4dK0tBpfZ8pjec3kcypGuGTuf4LTHEh65EuzySreLngYI0bQzoFSn3G3DYsw== dependencies: "@babel/core" "^7.0.0" + metro-source-map "0.56.3" -metro-babel7-plugin-react-transform@0.54.1: - version "0.54.1" - resolved "https://registry.yarnpkg.com/metro-babel7-plugin-react-transform/-/metro-babel7-plugin-react-transform-0.54.1.tgz#5335b810284789724886dc483d5bde9c149a1996" - integrity sha512-jWm5myuMoZAOhoPsa8ItfDxdTcOzKhTTzzhFlbZnRamE7i9qybeMdrZt8KHQpF7i2p/mKzE9Yhf4ouOz5K/jHg== - dependencies: - "@babel/helper-module-imports" "^7.0.0" - -metro-cache@0.54.1: - version "0.54.1" - resolved "https://registry.yarnpkg.com/metro-cache/-/metro-cache-0.54.1.tgz#2e9017cbd11106837b8c385c9eb8c8175469a8c1" - integrity sha512-RxCFoNcANHXZYi4MIQNnqh68gUnC3bMpzCFJY5pBoqqdrkkn8ibYglBweA0/DW7hx1OZTJWelwS1Dp8xxmE2CA== +metro-cache@0.56.3: + version "0.56.3" + resolved "https://registry.yarnpkg.com/metro-cache/-/metro-cache-0.56.3.tgz#1b0759bc45291cc3ffc77736c09dcfbd322edb8b" + integrity sha512-SsryVe/TVkt2IkEGnYhB3gQlg9iMlu8WJikQHcCEjMfPEnSIzmeymrX73fwQNPnTnN7F3E0HVjH6Wvq6fh0mcA== dependencies: jest-serializer "^24.4.0" - metro-core "0.54.1" + metro-core "0.56.3" mkdirp "^0.5.1" rimraf "^2.5.4" -metro-config@0.54.1, metro-config@^0.54.1: - version "0.54.1" - resolved "https://registry.yarnpkg.com/metro-config/-/metro-config-0.54.1.tgz#808b4e17625d9f4e9afa34232778fdf8e63cc8dd" - integrity sha512-FpxrA+63rGkPGvGI653dvuSreJzU+eOTILItVnnhmqwn2SAK5V00N/qGTOIJe2YIuWEFXwCzw9lXmANrXbwuGg== +metro-config@0.56.3, metro-config@^0.56.0: + version "0.56.3" + resolved "https://registry.yarnpkg.com/metro-config/-/metro-config-0.56.3.tgz#b16e600817c58c768946f24b039d2a1ba6a67651" + integrity sha512-C3ZLA5y5gW5auDSQN5dsCTduJg7LXEiX/tLAADOkgXWVImr5P74x9Wt8y1MMWrKx6p+4p5RMDyEwWDMXJt/DwA== dependencies: cosmiconfig "^5.0.5" jest-validate "^24.7.0" - metro "0.54.1" - metro-cache "0.54.1" - metro-core "0.54.1" + metro "0.56.3" + metro-cache "0.56.3" + metro-core "0.56.3" pretty-format "^24.7.0" -metro-core@0.54.1, metro-core@^0.54.1: - version "0.54.1" - resolved "https://registry.yarnpkg.com/metro-core/-/metro-core-0.54.1.tgz#17f6ecc167918da8819d4af5726349e55714954b" - integrity sha512-8oz3Ck7QFBzW9dG9tKFhrXHKPu2Ajx3R7eatf61Gl6Jf/tF7PNouv3wHxPsJW3oXDFiwKLszd89+OgleTGkB5g== +metro-core@0.56.3, metro-core@^0.56.0: + version "0.56.3" + resolved "https://registry.yarnpkg.com/metro-core/-/metro-core-0.56.3.tgz#34bb3a92621fd9b1ed3e6a01c6a4324fbb1201d9" + integrity sha512-OAaHP3mBdlACMZRwDJzZzYC0o2S3qfb4BBK75L8H4Ds+y3QUSrjsDEpHACcpaMTOds8rBvjzn+jjB5tqNoHfBA== dependencies: jest-haste-map "^24.7.1" lodash.throttle "^4.1.1" - metro-resolver "0.54.1" + metro-resolver "0.56.3" wordwrap "^1.0.0" -metro-inspector-proxy@0.54.1: - version "0.54.1" - resolved "https://registry.yarnpkg.com/metro-inspector-proxy/-/metro-inspector-proxy-0.54.1.tgz#0ef48ee3feb11c6da47aa100151a9bf2a7c358ee" - integrity sha512-sf6kNu7PgFW6U+hU7YGZfbAUKAPVvCJhY8YVu/A1RMKH9nNULrCo+jlWh0gWgmFfWRQiAPCElevROg+5somk8A== +metro-inspector-proxy@0.56.3: + version "0.56.3" + resolved "https://registry.yarnpkg.com/metro-inspector-proxy/-/metro-inspector-proxy-0.56.3.tgz#48046f9e3f7153be2409e0bee9252dede932ac39" + integrity sha512-7WtHinw+VJcunQ3q8El1MqqzYSRvXEjW5QE13VYwcLtnay3pvcqACeiQmGbWI0IqxB1+QH8tf3nkA7z7pQ7Vpw== dependencies: connect "^3.6.5" debug "^2.2.0" @@ -4186,17 +4207,17 @@ metro-inspector-proxy@0.54.1: ws "^1.1.5" yargs "^9.0.0" -metro-minify-uglify@0.54.1: - version "0.54.1" - resolved "https://registry.yarnpkg.com/metro-minify-uglify/-/metro-minify-uglify-0.54.1.tgz#54ed1cb349245ce82dba8cc662bbf69fbca142c3" - integrity sha512-z+pOPna/8IxD4OhjW6Xo1mV2EszgqqQHqBm1FdmtdF6IpWkQp33qpDBNEi9NGZTOr7pp2bvcxZnvNJdC2lrK9Q== +metro-minify-uglify@0.56.3: + version "0.56.3" + resolved "https://registry.yarnpkg.com/metro-minify-uglify/-/metro-minify-uglify-0.56.3.tgz#763b26895f79d0589d3391dc94083d348cf9c2be" + integrity sha512-b9ljyeUpkJWVlFy8M/i4aNbvEBI0zN9vJh1jfU7yx+k9dX7FulLnpGmAQxxQdEszcM//sJrsKNS1oLYBxr0NMQ== dependencies: uglify-es "^3.1.9" -metro-react-native-babel-preset@0.54.1: - version "0.54.1" - resolved "https://registry.yarnpkg.com/metro-react-native-babel-preset/-/metro-react-native-babel-preset-0.54.1.tgz#b8f03865c381841d7f8912e7ba46804ea3a928b8" - integrity sha512-Hfr32+u5yYl3qhYQJU8NQ26g4kQlc3yFMg7keVR/3H8rwBIbFqXgsKt8oe0dOrv7WvrMqBHhDtVdU9ls3sSq8g== +metro-react-native-babel-preset@0.56.3: + version "0.56.3" + resolved "https://registry.yarnpkg.com/metro-react-native-babel-preset/-/metro-react-native-babel-preset-0.56.3.tgz#5a1097c2f94e8ee0797a8ba2ab8f86d096f4c093" + integrity sha512-tGPzX2ZwI8vQ8SiNVBPUIgKqmaRNVB6rtJtHCBQZAYRiMbxh0NHCUoFfKBej6U5qVgxiYYHyN8oB23evG4/Oow== dependencies: "@babel/plugin-proposal-class-properties" "^7.0.0" "@babel/plugin-proposal-export-default-from" "^7.0.0" @@ -4232,8 +4253,7 @@ metro-react-native-babel-preset@0.54.1: "@babel/plugin-transform-typescript" "^7.0.0" "@babel/plugin-transform-unicode-regex" "^7.0.0" "@babel/template" "^7.0.0" - metro-babel7-plugin-react-transform "0.54.1" - react-transform-hmr "^1.0.4" + react-refresh "^0.4.0" metro-react-native-babel-preset@^0.56.0: version "0.56.0" @@ -4276,59 +4296,52 @@ metro-react-native-babel-preset@^0.56.0: "@babel/template" "^7.0.0" react-refresh "^0.4.0" -metro-react-native-babel-transformer@0.54.1, metro-react-native-babel-transformer@^0.54.1: - version "0.54.1" - resolved "https://registry.yarnpkg.com/metro-react-native-babel-transformer/-/metro-react-native-babel-transformer-0.54.1.tgz#45b56db004421134e10e739f69e8de50775fef17" - integrity sha512-ECw7xG91t8dk/PHdiyoC5SP1s9OQzfmJzG5m0YOZaKtHMe534qTDbncxaKfTI3CP99yti2maXFBRVj+xyvph/g== +metro-react-native-babel-transformer@^0.56.0: + version "0.56.3" + resolved "https://registry.yarnpkg.com/metro-react-native-babel-transformer/-/metro-react-native-babel-transformer-0.56.3.tgz#e68205230be65c07290b932f7684226013dae310" + integrity sha512-T87m4jDu0gIvJo8kWEvkodWFgQ8XBzJUESs1hUUTBSMIqTa31MdWfA1gs+MipadG7OsEJpcb9m83mGr8K70MWw== dependencies: "@babel/core" "^7.0.0" babel-preset-fbjs "^3.1.2" - metro-babel-transformer "0.54.1" - metro-react-native-babel-preset "0.54.1" + metro-babel-transformer "0.56.3" + metro-react-native-babel-preset "0.56.3" + metro-source-map "0.56.3" -metro-resolver@0.54.1: - version "0.54.1" - resolved "https://registry.yarnpkg.com/metro-resolver/-/metro-resolver-0.54.1.tgz#0295b38624b678b88b16bf11d47288845132b087" - integrity sha512-Byv1LIawYAASy9CFRwzrncYnqaFGLe8vpw178EtzStqP05Hu6hXSqkNTrfoXa+3V9bPFGCrVzFx2NY3gFp2btg== +metro-resolver@0.56.3: + version "0.56.3" + resolved "https://registry.yarnpkg.com/metro-resolver/-/metro-resolver-0.56.3.tgz#f18978b919a5ecc67028732609a564880715ef75" + integrity sha512-VvMl4xUp0fy76WiP3YDtzMmrn6tN/jwxOBqlTy9MjN6R9sUXrGyO5thwn/uKQqp5vwBTuJev7nZL7OKzwludKA== dependencies: absolute-path "^0.0.0" -metro-source-map@0.54.1: - version "0.54.1" - resolved "https://registry.yarnpkg.com/metro-source-map/-/metro-source-map-0.54.1.tgz#e17bad53c11978197d3c05c9168d799c2e04dcc5" - integrity sha512-E9iSYMSUSq5qYi1R2hTQtxH4Mxjzfgr/jaSmQIWi7h3fG2P1qOZNNSzeaeUeTK+s2N/ksVlkcL5kMikol8CDrQ== - dependencies: - "@babel/traverse" "^7.0.0" - "@babel/types" "^7.0.0" - source-map "^0.5.6" - -metro-source-map@0.55.0, metro-source-map@^0.55.0: - version "0.55.0" - resolved "https://registry.yarnpkg.com/metro-source-map/-/metro-source-map-0.55.0.tgz#1f6289905f08277c398f2b9b9c13e7e0e5a6f540" - integrity sha512-HZODA0KPl5onJNGIztfTHHWurR2nL6Je/X8wwj+bL4ZBB/hSMVeDk7rWReCAvO3twVz7Ztp8Si0jfMmmH4Ruuw== +metro-source-map@0.56.3, metro-source-map@^0.56.0: + version "0.56.3" + resolved "https://registry.yarnpkg.com/metro-source-map/-/metro-source-map-0.56.3.tgz#0cadc9f9eca9ece224a6fd28b9e4fa3a9834e24c" + integrity sha512-CheqWbJZSM0zjcNBqELUiocwH3XArrOk6alhVuzJ2gV/WTMBQFwP0TtQssSMwjnouMHNEzY8RxErXKXBk/zJmQ== dependencies: "@babel/traverse" "^7.0.0" "@babel/types" "^7.0.0" invariant "^2.2.4" - metro-symbolicate "0.55.0" - ob1 "0.55.0" + metro-symbolicate "0.56.3" + ob1 "0.56.3" source-map "^0.5.6" vlq "^1.0.0" -metro-symbolicate@0.55.0: - version "0.55.0" - resolved "https://registry.yarnpkg.com/metro-symbolicate/-/metro-symbolicate-0.55.0.tgz#4086a2adae54b5e44a4911ca572d8a7b03c71fa1" - integrity sha512-3r3Gpv5L4U7rBGpIqw5S1nun5MelfUMLRiScJsPRGZVTX3WY1w+zpaQKlWBi5yuHf5dMQ+ZUVbhb02IdrfJ2Fg== +metro-symbolicate@0.56.3: + version "0.56.3" + resolved "https://registry.yarnpkg.com/metro-symbolicate/-/metro-symbolicate-0.56.3.tgz#20f9dc52fab3209903715716402692b3ac16831c" + integrity sha512-fSQtjjy4eiJDThSl9eloxMElhrs+5PQB+DKKzmTFXT8e2GDga+pa1xTBFRUACMO8BXGuWmxR7SnGDw0wo5Ngrw== dependencies: - metro-source-map "0.55.0" + invariant "^2.2.4" + metro-source-map "0.56.3" source-map "^0.5.6" through2 "^2.0.1" vlq "^1.0.0" -metro@0.54.1, metro@^0.54.1: - version "0.54.1" - resolved "https://registry.yarnpkg.com/metro/-/metro-0.54.1.tgz#a629be00abee5a450a25a8f71c24745f70cc9b44" - integrity sha512-6ODPT4mEo4FCpbExRNnQAcZmf1VeNvYOTMj2Na03FjGqhNODHhI2U/wF/Ul5gqTyJ2dVdkXeyvKW3gl/LrnJRg== +metro@0.56.3, metro@^0.56.0: + version "0.56.3" + resolved "https://registry.yarnpkg.com/metro/-/metro-0.56.3.tgz#3a38706bf6b1200421e871a4c53ddc2f359f65a9" + integrity sha512-mxHpvBGWanZ46wAEZVLinNO5IYMcFbTdMZIRhC7r+rvoSK6r9iPj95AujBfzLXMAl36RI2O3D7yp5hOYif/gEQ== dependencies: "@babel/core" "^7.0.0" "@babel/generator" "^7.0.0" @@ -4357,21 +4370,21 @@ metro@0.54.1, metro@^0.54.1: json-stable-stringify "^1.0.1" lodash.throttle "^4.1.1" merge-stream "^1.0.1" - metro-babel-register "0.54.1" - metro-babel-transformer "0.54.1" - metro-cache "0.54.1" - metro-config "0.54.1" - metro-core "0.54.1" - metro-inspector-proxy "0.54.1" - metro-minify-uglify "0.54.1" - metro-react-native-babel-preset "0.54.1" - metro-resolver "0.54.1" - metro-source-map "0.54.1" + metro-babel-register "0.56.3" + metro-babel-transformer "0.56.3" + metro-cache "0.56.3" + metro-config "0.56.3" + metro-core "0.56.3" + metro-inspector-proxy "0.56.3" + metro-minify-uglify "0.56.3" + metro-react-native-babel-preset "0.56.3" + metro-resolver "0.56.3" + metro-source-map "0.56.3" + metro-symbolicate "0.56.3" mime-types "2.1.11" mkdirp "^0.5.1" node-fetch "^2.2.0" nullthrows "^1.1.0" - react-transform-hmr "^1.0.4" resolve "^1.5.0" rimraf "^2.5.4" serialize-error "^2.1.0" @@ -4455,12 +4468,6 @@ mimic-fn@^2.0.0: resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== -min-document@^2.19.0: - version "2.19.0" - resolved "https://registry.yarnpkg.com/min-document/-/min-document-2.19.0.tgz#7bd282e3f5842ed295bb748cdd9f1ffa2c824685" - dependencies: - dom-walk "^0.1.0" - minimatch@^3.0.2: version "3.0.3" resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.3.tgz#2a4e4090b96b2db06a9d7df01055a62a77c9b774" @@ -4729,10 +4736,10 @@ oauth-sign@~0.9.0: resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.9.0.tgz#47a7b016baa68b5fa0ecf3dee08a85c679ac6455" integrity sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ== -ob1@0.55.0: - version "0.55.0" - resolved "https://registry.yarnpkg.com/ob1/-/ob1-0.55.0.tgz#e393b4ae786ef442b3ef2a298ab70d6ec353dbdd" - integrity sha512-pfyiMVsUItl8WiRKMT15eCi662pCRAuYTq2+V3UpE+PpFErJI/TvRh/M/l/9TaLlbFr7krJ7gdl+FXJNcybmvw== +ob1@0.56.3: + version "0.56.3" + resolved "https://registry.yarnpkg.com/ob1/-/ob1-0.56.3.tgz#5829e446587c9bf89c22ece4f3757b29f2ccfd18" + integrity sha512-3JL2ZyWOHDGTEAe4kcG+TxhGPKCCikgyoUIjE82JnXnmpR1LXItM9K3WhGsi4+O7oYngMW6FjpHHoc5xJTMkTQ== object-assign@^4.0.1, object-assign@^4.1.0, object-assign@^4.1.1: version "4.1.1" @@ -4932,7 +4939,7 @@ p-limit@^1.1.0: dependencies: p-try "^1.0.0" -p-limit@^2.0.0: +p-limit@^2.0.0, p-limit@^2.2.0: version "2.2.1" resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.2.1.tgz#aa07a788cc3151c939b5131f63570f0dd2009537" integrity sha512-85Tk+90UCVWvbDavCLKPOLC9vvY8OwEX/RtKF+/1OADJMVlFfEHOiMTPVyxg7mk/dKa+ipdHm0OUkTvCpMTuwg== @@ -4953,6 +4960,13 @@ p-locate@^3.0.0: dependencies: p-limit "^2.0.0" +p-locate@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-4.1.0.tgz#a3428bb7088b3a60292f66919278b7c297ad4f07" + integrity sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A== + dependencies: + p-limit "^2.2.0" + p-reduce@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/p-reduce/-/p-reduce-1.0.0.tgz#18c2b0dd936a4690a529f8231f58a0fdb6a47dfa" @@ -5014,6 +5028,11 @@ path-exists@^3.0.0: resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515" integrity sha1-zg6+ql94yxiSXqfYENe1mwEP1RU= +path-exists@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" + integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== + path-is-absolute@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" @@ -5137,10 +5156,6 @@ process-nextick-args@~2.0.0: resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2" integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag== -process@~0.5.1: - version "0.5.2" - resolved "https://registry.yarnpkg.com/process/-/process-0.5.2.tgz#1638d8a8e34c2f440a91db95ab9aeb677fc185cf" - progress@^2.0.0: version "2.0.3" resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.3.tgz#7e8cf8d8f5b8f239c1bc68beb4eb78567d572ef8" @@ -5215,11 +5230,7 @@ rc@^1.2.7: minimist "^1.2.0" strip-json-comments "~2.0.1" -react-deep-force-update@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/react-deep-force-update/-/react-deep-force-update-1.0.1.tgz#f911b5be1d2a6fe387507dd6e9a767aa2924b4c7" - -react-devtools-core@^3.6.1: +react-devtools-core@^3.6.3: version "3.6.3" resolved "https://registry.yarnpkg.com/react-devtools-core/-/react-devtools-core-3.6.3.tgz#977d95b684c6ad28205f0c62e1e12c5f16675814" integrity sha512-+P+eFy/yo8Z/UH9J0DqHZuUM5+RI2wl249TNvMx3J2jpUomLQa4Zxl56GEotGfw3PIP1eI+hVf1s53FlUONStQ== @@ -5238,21 +5249,21 @@ react-is@^16.8.4, react-is@^16.8.6: integrity sha512-tJBzzzIgnnRfEm046qRcURvwQnZVXmuCbscxUO5RWrGTXpon2d4c8mI0D8WE6ydVIm29JiLB6+RslkIvym9Rjw== "react-native-video@file:../..": - version "5.0.1" + version "5.1.0-alpha1" dependencies: keymirror "^0.1.1" prop-types "^15.5.10" shaka-player "^2.4.4" -react-native@0.60.5: - version "0.60.5" - resolved "https://registry.yarnpkg.com/react-native/-/react-native-0.60.5.tgz#3c1d9c06a0fbab9807220b6acac09488d39186ee" - integrity sha512-cZwI0XzzihACN+7an1Dy46A83FRaAe2Xyd7laCalFFAppZIYeMVphZQWrVljJk5kIZBNtYG35TY1VsghQ0Oc2Q== +react-native@0.61.5: + version "0.61.5" + resolved "https://registry.yarnpkg.com/react-native/-/react-native-0.61.5.tgz#6e21acb56cbd75a3baeb1f70201a66f42600bba8" + integrity sha512-MXqE3NoGO0T3dUKIKkIppijBhRRMpfN6ANbhMXHDuyfA+fSilRWgCwYgR/YNCC7ntECoJYikKaNTUBB0DeQy6Q== dependencies: "@babel/runtime" "^7.0.0" - "@react-native-community/cli" "^2.6.0" - "@react-native-community/cli-platform-android" "^2.6.0" - "@react-native-community/cli-platform-ios" "^2.4.1" + "@react-native-community/cli" "^3.0.0" + "@react-native-community/cli-platform-android" "^3.0.0" + "@react-native-community/cli-platform-ios" "^3.0.0" abort-controller "^3.0.0" art "^0.10.0" base64-js "^1.1.2" @@ -5262,29 +5273,23 @@ react-native@0.60.5: event-target-shim "^5.0.1" fbjs "^1.0.0" fbjs-scripts "^1.1.0" - hermesvm "^0.1.0" + hermes-engine "^0.2.1" invariant "^2.2.4" - jsc-android "245459.0.0" - metro-babel-register "0.54.1" - metro-react-native-babel-transformer "0.54.1" - metro-source-map "^0.55.0" + jsc-android "^245459.0.0" + metro-babel-register "^0.56.0" + metro-react-native-babel-transformer "^0.56.0" + metro-source-map "^0.56.0" nullthrows "^1.1.0" pretty-format "^24.7.0" promise "^7.1.1" prop-types "^15.7.2" - react-devtools-core "^3.6.1" + react-devtools-core "^3.6.3" + react-refresh "^0.4.0" regenerator-runtime "^0.13.2" - scheduler "0.14.0" + scheduler "0.15.0" stacktrace-parser "^0.1.3" whatwg-fetch "^3.0.0" -react-proxy@^1.1.7: - version "1.1.8" - resolved "https://registry.yarnpkg.com/react-proxy/-/react-proxy-1.1.8.tgz#9dbfd9d927528c3aa9f444e4558c37830ab8c26a" - dependencies: - lodash "^4.6.1" - react-deep-force-update "^1.0.0" - react-refresh@^0.4.0: version "0.4.2" resolved "https://registry.yarnpkg.com/react-refresh/-/react-refresh-0.4.2.tgz#54a277a6caaac2803d88f1d6f13c1dcfbd81e334" @@ -5300,13 +5305,6 @@ react-test-renderer@16.8.6: react-is "^16.8.6" scheduler "^0.13.6" -react-transform-hmr@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/react-transform-hmr/-/react-transform-hmr-1.0.4.tgz#e1a40bd0aaefc72e8dfd7a7cda09af85066397bb" - dependencies: - global "^4.3.0" - react-proxy "^1.1.7" - react@16.9.0: version "16.9.0" resolved "https://registry.yarnpkg.com/react/-/react-16.9.0.tgz#40ba2f9af13bc1a38d75dbf2f4359a5185c4f7aa" @@ -5667,10 +5665,10 @@ sax@^1.2.1, sax@^1.2.4: resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9" integrity sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw== -scheduler@0.14.0: - version "0.14.0" - resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.14.0.tgz#b392c23c9c14bfa2933d4740ad5603cc0d59ea5b" - integrity sha512-9CgbS06Kki2f4R9FjLSITjZo5BZxPsryiRNyL3LpvrM9WxcVmhlqAOc9E+KQbeI2nqej4JIIbOsfdL51cNb4Iw== +scheduler@0.15.0: + version "0.15.0" + resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.15.0.tgz#6bfcf80ff850b280fed4aeecc6513bc0b4f17f8e" + integrity sha512-xAefmSfN6jqAa7Kuq7LIJY0bwAPG3xlCj0HMEBQk1lxYiDKZscY2xJ5U/61ZTrYbmNQbXa+gc7czPkVo11tnCg== dependencies: loose-envify "^1.1.0" object-assign "^4.1.1" @@ -5683,7 +5681,7 @@ scheduler@^0.13.6: loose-envify "^1.1.0" object-assign "^4.1.1" -"semver@2 || 3 || 4 || 5", semver@^5.0.3, semver@^5.1.0: +"semver@2 || 3 || 4 || 5", semver@^5.1.0: version "5.3.0" resolved "https://registry.yarnpkg.com/semver/-/semver-5.3.0.tgz#9b2ce5d3de02d17c6012ad326aa6b4d0cf54f94f" @@ -5702,7 +5700,7 @@ semver@^5.5.1, semver@^5.6.0: resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== -semver@^6.0.0, semver@^6.1.2, semver@^6.2.0: +semver@^6.0.0, semver@^6.1.2, semver@^6.2.0, semver@^6.3.0: version "6.3.0" resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== @@ -6081,6 +6079,11 @@ strip-json-comments@~2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" +sudo-prompt@^9.0.0: + version "9.1.1" + resolved "https://registry.yarnpkg.com/sudo-prompt/-/sudo-prompt-9.1.1.tgz#73853d729770392caec029e2470db9c221754db0" + integrity sha512-es33J1g2HjMpyAhz8lOR+ICmXXAqTuKbuXuUWLhOLew20oN9oUCgCJx615U/v7aioZg7IX5lIh9x34vwneu4pA== + supports-color@^5.3.0: version "5.5.0" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" diff --git a/ios/Video/RCTVideo.m b/ios/Video/RCTVideo.m index 46ab23d0ad..ae2bae5b72 100644 --- a/ios/Video/RCTVideo.m +++ b/ios/Video/RCTVideo.m @@ -274,7 +274,7 @@ - (void)sendProgressUpdate [[NSNotificationCenter defaultCenter] postNotificationName:@"RCTVideo_progress" object:nil userInfo:@{@"progress": [NSNumber numberWithDouble: currentTimeSecs / duration]}]; if( currentTimeSecs >= 0 && self.onVideoProgress) { - if(!_isRequestAds && !_paused) { + if(!_isRequestAds) { [self requestAds]; _isRequestAds = true; } From 6a49f539c9eeec4c2a86b303de3b909519bda079 Mon Sep 17 00:00:00 2001 From: Robby Widyahartono Date: Tue, 10 Dec 2019 12:17:25 +0700 Subject: [PATCH 005/388] update readme --- README.md | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/README.md b/README.md index 2ce6995af0..8f4803c802 100644 --- a/README.md +++ b/README.md @@ -290,6 +290,7 @@ var styles = StyleSheet.create({ ``` ### Configurable props +* [adTagUrl](#adTagUrl) * [allowsExternalPlayback](#allowsexternalplayback) * [audioOnly](#audioonly) * [automaticallyWaitsToMinimizeStalling](#automaticallyWaitsToMinimizeStalling) @@ -356,6 +357,21 @@ var styles = StyleSheet.create({ ### Configurable props +#### adTagUrl +Sets the ad url + +Example: +``` +const adTagUrl = "https://pubads.g.doubleclick.net/gampad/ads?sz=640x480&iu=/124319096/external/" ++ "ad_rule_samples&ciu_szs=300x250&ad_rule=1&impl=s&gdfp_req=1&env=vp" ++ "&output=vmap&unviewed_position_start=1&cust_params=deployment%3Ddevsite" ++ "%26sample_ar%3Dpremidpost&cmsid=496&vid=short_onecue&correlator="; + +adTagUrl={adTagUrl} +``` + +Platforms: all + #### allowsExternalPlayback Indicates whether the player allows switching to external playback mode such as AirPlay or HDMI. * **true (default)** - allow switching to external playback mode From e455ea0756dd073ea9175b201b1a1e65ba9d827c Mon Sep 17 00:00:00 2001 From: Robby Widyahartono Date: Tue, 10 Dec 2019 13:40:26 +0700 Subject: [PATCH 006/388] call requestAds when video playing --- ios/Video/RCTVideo.m | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ios/Video/RCTVideo.m b/ios/Video/RCTVideo.m index ae2bae5b72..93e4f67bfa 100644 --- a/ios/Video/RCTVideo.m +++ b/ios/Video/RCTVideo.m @@ -274,7 +274,7 @@ - (void)sendProgressUpdate [[NSNotificationCenter defaultCenter] postNotificationName:@"RCTVideo_progress" object:nil userInfo:@{@"progress": [NSNumber numberWithDouble: currentTimeSecs / duration]}]; if( currentTimeSecs >= 0 && self.onVideoProgress) { - if(!_isRequestAds) { + if(!_isRequestAds && currentTimeSecs >= 0.0001) { [self requestAds]; _isRequestAds = true; } From 02cd0b529be19419257cac9d15a44a722daba3a4 Mon Sep 17 00:00:00 2001 From: Robby Widyahartono Date: Wed, 12 Feb 2020 10:27:30 +0700 Subject: [PATCH 007/388] Update README.md change Platforms description for adTagUrl --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 8f4803c802..b204704ae1 100644 --- a/README.md +++ b/README.md @@ -370,7 +370,7 @@ const adTagUrl = "https://pubads.g.doubleclick.net/gampad/ads?sz=640x480&iu=/124 adTagUrl={adTagUrl} ``` -Platforms: all +Platforms: Android ExoPlayer, iOS #### allowsExternalPlayback Indicates whether the player allows switching to external playback mode such as AirPlay or HDMI. From e1d24fceb5967c5c50b130cbdb1dd86bbacc48fe Mon Sep 17 00:00:00 2001 From: Robby Widyahartono Date: Wed, 12 Feb 2020 10:39:51 +0700 Subject: [PATCH 008/388] Remove unused code --- .../main/java/com/brentvatne/exoplayer/ExoPlayerView.java | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/android-exoplayer/src/main/java/com/brentvatne/exoplayer/ExoPlayerView.java b/android-exoplayer/src/main/java/com/brentvatne/exoplayer/ExoPlayerView.java index a8d6311a2b..6564eaa9a5 100644 --- a/android-exoplayer/src/main/java/com/brentvatne/exoplayer/ExoPlayerView.java +++ b/android-exoplayer/src/main/java/com/brentvatne/exoplayer/ExoPlayerView.java @@ -136,11 +136,8 @@ public ViewGroup getAdViewGroup() { public View[] getAdOverlayViews() { ArrayList overlayViews = new ArrayList<>(); if (adOverlayFrameLayout != null) { - overlayViews.add(adOverlayFrameLayout); + overlayViews.add(adOverlayFrameLayout); } - // if (controller != null) { - // overlayViews.add(controller); - // } return overlayViews.toArray(new View[0]); } From 94bceb472bce35b08e04b2e93bb0c11096ce30fe Mon Sep 17 00:00:00 2001 From: Tuan Luong Date: Sat, 4 Jul 2020 17:41:15 +0700 Subject: [PATCH 009/388] add fullscreen activity --- .../ExoPlayerFullscreenVideoActivity.java | 107 ++++++++++++++++++ .../brentvatne/exoplayer/ExoPlayerView.java | 3 - .../exoplayer/ReactExoplayerView.java | 91 ++++++++++----- .../res/layout/exo_player_control_view.xml | 19 +++- .../layout/exo_player_fullscreen_video.xml | 18 +++ android/src/main/AndroidManifest.xml | 8 +- 6 files changed, 211 insertions(+), 35 deletions(-) create mode 100644 android-exoplayer/src/main/java/com/brentvatne/exoplayer/ExoPlayerFullscreenVideoActivity.java create mode 100644 android-exoplayer/src/main/res/layout/exo_player_fullscreen_video.xml diff --git a/android-exoplayer/src/main/java/com/brentvatne/exoplayer/ExoPlayerFullscreenVideoActivity.java b/android-exoplayer/src/main/java/com/brentvatne/exoplayer/ExoPlayerFullscreenVideoActivity.java new file mode 100644 index 0000000000..1f2ee1d5b2 --- /dev/null +++ b/android-exoplayer/src/main/java/com/brentvatne/exoplayer/ExoPlayerFullscreenVideoActivity.java @@ -0,0 +1,107 @@ +package com.brentvatne.exoplayer; + +import android.os.Bundle; +import android.view.View; +import android.widget.ImageView; + +import androidx.appcompat.app.AppCompatActivity; + +import com.brentvatne.react.R; +import com.google.android.exoplayer2.Player; +import com.google.android.exoplayer2.SimpleExoPlayer; +import com.google.android.exoplayer2.ui.PlayerControlView; + +public class ExoPlayerFullscreenVideoActivity extends AppCompatActivity implements ReactExoplayerView.FullScreenDelegate { + public static final String EXTRA_ID = "extra_id"; + public static final String EXTRA_IS_PLAYING = "extra_is_playing"; + + private int id; + private PlayerControlView playerControlView; + private SimpleExoPlayer player; + + @Override + public void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.exo_player_fullscreen_video); + id = getIntent().getIntExtra(EXTRA_ID, -1); + player = ReactExoplayerView.getViewInstance(id).getPlayer(); + + ExoPlayerView playerView = findViewById(R.id.player_view); + playerView.setPlayer(player); + playerView.setOnClickListener(v -> togglePlayerControlVisibility()); + + playerControlView = findViewById(R.id.player_controls); + playerControlView.setPlayer(player); + // Set the fullscreen button to "close fullscreen" icon + ImageView fullscreenIcon = playerControlView.findViewById(R.id.exo_fullscreen_icon); + fullscreenIcon.setImageResource(R.drawable.exo_controls_fullscreen_exit); + playerControlView.findViewById(R.id.exo_fullscreen_button) + .setOnClickListener(v -> finish()); + } + + @Override + public void onResume() { + super.onResume(); + boolean isPlaying = getIntent().getBooleanExtra(EXTRA_IS_PLAYING, false); + player.setPlayWhenReady(isPlaying); + ReactExoplayerView.getViewInstance(id).registerFullScreenDelegate(this); + } + + @Override + public void onPause() { + super.onPause(); + boolean isPlaying = player.getPlayWhenReady() && player.getPlaybackState() == Player.STATE_READY; + ReactExoplayerView.getViewInstance(id).setPausedModifier(!isPlaying); + player.setPlayWhenReady(false); + ReactExoplayerView.getViewInstance(id).registerFullScreenDelegate(null); + } + + @Override + public void onWindowFocusChanged(boolean hasFocus) { + super.onWindowFocusChanged(hasFocus); + if (hasFocus) { + hideSystemUI(); + } + } + + private void togglePlayerControlVisibility() { + if (playerControlView.isVisible()) { + playerControlView.hide(); + } else { + playerControlView.show(); + } + } + + /** + * Enables regular immersive mode. + */ + private void hideSystemUI() { + View decorView = getWindow().getDecorView(); + decorView.setSystemUiVisibility( + View.SYSTEM_UI_FLAG_IMMERSIVE + // Set the content to appear under the system bars so that the + // content doesn't resize when the system bars hide and show. + | View.SYSTEM_UI_FLAG_LAYOUT_STABLE + | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION + | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN + // Hide the nav bar and status bar + | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION + | View.SYSTEM_UI_FLAG_FULLSCREEN); + } + + /** + * Shows the system bars by removing all the flags + * except for the ones that make the content appear under the system bars. + */ + private void showSystemUI() { + View decorView = getWindow().getDecorView(); + decorView.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_STABLE + | View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION + | View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN); + } + + @Override + public void closeFullScreen() { + finish(); + } +} diff --git a/android-exoplayer/src/main/java/com/brentvatne/exoplayer/ExoPlayerView.java b/android-exoplayer/src/main/java/com/brentvatne/exoplayer/ExoPlayerView.java index afa5106c19..1a244f2921 100644 --- a/android-exoplayer/src/main/java/com/brentvatne/exoplayer/ExoPlayerView.java +++ b/android-exoplayer/src/main/java/com/brentvatne/exoplayer/ExoPlayerView.java @@ -120,9 +120,6 @@ private void updateShutterViewVisibility() { * @param player The {@link SimpleExoPlayer} to use. */ public void setPlayer(SimpleExoPlayer player) { - if (this.player == player) { - return; - } if (this.player != null) { this.player.setTextOutput(null); this.player.setVideoListener(null); diff --git a/android-exoplayer/src/main/java/com/brentvatne/exoplayer/ReactExoplayerView.java b/android-exoplayer/src/main/java/com/brentvatne/exoplayer/ReactExoplayerView.java index 4e6fea586d..6cd6b84498 100644 --- a/android-exoplayer/src/main/java/com/brentvatne/exoplayer/ReactExoplayerView.java +++ b/android-exoplayer/src/main/java/com/brentvatne/exoplayer/ReactExoplayerView.java @@ -1,8 +1,8 @@ package com.brentvatne.exoplayer; import android.annotation.SuppressLint; -import android.app.Activity; import android.content.Context; +import android.content.Intent; import android.media.AudioManager; import android.net.Uri; import android.os.Handler; @@ -10,10 +10,12 @@ import android.text.TextUtils; import android.util.Log; import android.view.View; -import android.view.Window; import android.view.accessibility.CaptioningManager; import android.widget.FrameLayout; -import android.widget.ImageButton; + +import androidx.fragment.app.Fragment; +import androidx.fragment.app.FragmentActivity; +import androidx.fragment.app.FragmentTransaction; import com.brentvatne.react.R; import com.brentvatne.receiver.AudioBecomingNoisyReceiver; @@ -25,28 +27,33 @@ import com.facebook.react.bridge.ReadableMap; import com.facebook.react.bridge.WritableArray; import com.facebook.react.bridge.WritableMap; +import com.facebook.react.modules.timepicker.TimePickerDialogFragment; +import com.facebook.react.uimanager.NativeViewHierarchyManager; import com.facebook.react.uimanager.ThemedReactContext; +import com.facebook.react.uimanager.UIBlock; +import com.facebook.react.uimanager.UIManagerModule; import com.google.android.exoplayer2.C; import com.google.android.exoplayer2.DefaultLoadControl; -import com.google.android.exoplayer2.DefaultRenderersFactory; import com.google.android.exoplayer2.ExoPlaybackException; +import com.google.android.exoplayer2.ExoPlayer; import com.google.android.exoplayer2.ExoPlayerFactory; import com.google.android.exoplayer2.Format; import com.google.android.exoplayer2.PlaybackParameters; import com.google.android.exoplayer2.Player; import com.google.android.exoplayer2.SimpleExoPlayer; import com.google.android.exoplayer2.Timeline; +import com.google.android.exoplayer2.extractor.DefaultExtractorsFactory; import com.google.android.exoplayer2.mediacodec.MediaCodecRenderer; import com.google.android.exoplayer2.mediacodec.MediaCodecUtil; import com.google.android.exoplayer2.metadata.Metadata; -import com.google.android.exoplayer2.metadata.MetadataOutput; +import com.google.android.exoplayer2.metadata.MetadataRenderer; import com.google.android.exoplayer2.source.BehindLiveWindowException; +import com.google.android.exoplayer2.source.ExtractorMediaSource; import com.google.android.exoplayer2.source.MediaSource; import com.google.android.exoplayer2.source.MergingMediaSource; -import com.google.android.exoplayer2.source.ProgressiveMediaSource; import com.google.android.exoplayer2.source.SingleSampleMediaSource; -import com.google.android.exoplayer2.source.TrackGroup; import com.google.android.exoplayer2.source.TrackGroupArray; +import com.google.android.exoplayer2.source.TrackGroup; import com.google.android.exoplayer2.source.dash.DashMediaSource; import com.google.android.exoplayer2.source.dash.DefaultDashChunkSource; import com.google.android.exoplayer2.source.hls.HlsMediaSource; @@ -57,17 +64,20 @@ import com.google.android.exoplayer2.trackselection.MappingTrackSelector; import com.google.android.exoplayer2.trackselection.TrackSelection; import com.google.android.exoplayer2.trackselection.TrackSelectionArray; -import com.google.android.exoplayer2.ui.PlayerControlView; -import com.google.android.exoplayer2.upstream.BandwidthMeter; import com.google.android.exoplayer2.upstream.DataSource; import com.google.android.exoplayer2.upstream.DefaultAllocator; +import com.google.android.exoplayer2.upstream.BandwidthMeter; import com.google.android.exoplayer2.upstream.DefaultBandwidthMeter; -import com.google.android.exoplayer2.upstream.HttpDataSource; import com.google.android.exoplayer2.util.Util; +import com.google.android.exoplayer2.ui.PlayerControlView; import java.net.CookieHandler; import java.net.CookieManager; import java.net.CookiePolicy; +import java.lang.Math; +import java.util.HashMap; +import java.util.Map; +import java.lang.Object; import java.util.ArrayList; import java.util.Locale; import java.util.Map; @@ -91,6 +101,11 @@ class ReactExoplayerView extends FrameLayout implements DEFAULT_COOKIE_MANAGER.setCookiePolicy(CookiePolicy.ACCEPT_ORIGINAL_SERVER); } + private static Map instances = new HashMap<>(); + private static int UNIQUE_ID = 0; + private int uid = ++UNIQUE_ID; + private FullScreenDelegate fullScreenDelegate; + private final VideoEventEmitter eventEmitter; private final ReactExoplayerConfig config; private final DefaultBandwidthMeter bandwidthMeter; @@ -187,7 +202,6 @@ public ReactExoplayerView(ThemedReactContext context, ReactExoplayerConfig confi createViews(); audioManager = (AudioManager) context.getSystemService(Context.AUDIO_SERVICE); - themedReactContext.addLifecycleEventListener(this); audioBecomingNoisyReceiver = new AudioBecomingNoisyReceiver(themedReactContext); initializePlayer(); @@ -235,6 +249,7 @@ protected void onDetachedFromWindow() { @Override public void onHostResume() { + exoPlayerView.setPlayer(player); if (!playInBackground || !isInBackground) { setPlayWhenReady(!isPaused); } @@ -275,6 +290,22 @@ public void onBandwidthSample(int elapsedMs, long bytes, long bitrate) { } } + public static ReactExoplayerView getViewInstance(Integer uid) { + return instances.get(uid); + } + + public SimpleExoPlayer getPlayer() { + return player; + } + + public boolean isPaused() { + return isPaused; + } + + public void registerFullScreenDelegate(FullScreenDelegate delegate) { + this.fullScreenDelegate = delegate; + } + // Internal methods /** @@ -290,6 +321,15 @@ private void togglePlayerControlVisibility() { } } + private void showFullscreen() { + instances.put(uid, this); + Intent intent = new Intent(getContext(), ExoPlayerFullscreenVideoActivity.class); + intent.putExtra(ExoPlayerFullscreenVideoActivity.EXTRA_ID, this.uid); + boolean isPlaying = player.getPlayWhenReady() && player.getPlaybackState() == Player.STATE_READY; + intent.putExtra(ExoPlayerFullscreenVideoActivity.EXTRA_IS_PLAYING, isPlaying); + getContext().startActivity(intent); + } + /** * Initializing Player control */ @@ -302,6 +342,7 @@ private void initializePlayerControl() { playerControlView.setPlayer(player); playerControlView.show(); playPauseControlContainer = playerControlView.findViewById(R.id.exo_play_pause_container); + playerControlView.findViewById(R.id.exo_fullscreen_button).setOnClickListener(v -> showFullscreen()); // Invoking onClick event for exoplayerView exoPlayerView.setOnClickListener(new OnClickListener() { @@ -374,6 +415,7 @@ private void reLayout(View view) { } private void initializePlayer() { + themedReactContext.addLifecycleEventListener(this); ReactExoplayerView self = this; // This ensures all props have been settled, to avoid async racing conditions. new Handler().postDelayed(new Runnable() { @@ -1217,30 +1259,15 @@ public void setFullscreen(boolean fullscreen) { return; // Avoid generating events when nothing is changing } isFullscreen = fullscreen; - - Activity activity = themedReactContext.getCurrentActivity(); - if (activity == null) { - return; - } - Window window = activity.getWindow(); - View decorView = window.getDecorView(); - int uiOptions; if (isFullscreen) { - if (Util.SDK_INT >= 19) { // 4.4+ - uiOptions = SYSTEM_UI_FLAG_HIDE_NAVIGATION - | SYSTEM_UI_FLAG_IMMERSIVE_STICKY - | SYSTEM_UI_FLAG_FULLSCREEN; - } else { - uiOptions = SYSTEM_UI_FLAG_HIDE_NAVIGATION - | SYSTEM_UI_FLAG_FULLSCREEN; - } eventEmitter.fullscreenWillPresent(); - decorView.setSystemUiVisibility(uiOptions); + showFullscreen(); eventEmitter.fullscreenDidPresent(); } else { - uiOptions = View.SYSTEM_UI_FLAG_VISIBLE; eventEmitter.fullscreenWillDismiss(); - decorView.setSystemUiVisibility(uiOptions); + if (fullScreenDelegate != null) { + fullScreenDelegate.closeFullScreen(); + } eventEmitter.fullscreenDidDismiss(); } } @@ -1279,4 +1306,8 @@ public void setControls(boolean controls) { } } } + + public interface FullScreenDelegate { + void closeFullScreen(); + } } diff --git a/android-exoplayer/src/main/res/layout/exo_player_control_view.xml b/android-exoplayer/src/main/res/layout/exo_player_control_view.xml index becee6a901..51cbf3a81e 100644 --- a/android-exoplayer/src/main/res/layout/exo_player_control_view.xml +++ b/android-exoplayer/src/main/res/layout/exo_player_control_view.xml @@ -1,5 +1,6 @@ - + + + + + + diff --git a/android-exoplayer/src/main/res/layout/exo_player_fullscreen_video.xml b/android-exoplayer/src/main/res/layout/exo_player_fullscreen_video.xml new file mode 100644 index 0000000000..671a00eec2 --- /dev/null +++ b/android-exoplayer/src/main/res/layout/exo_player_fullscreen_video.xml @@ -0,0 +1,18 @@ + + + + + + + \ No newline at end of file diff --git a/android/src/main/AndroidManifest.xml b/android/src/main/AndroidManifest.xml index 3535ad445f..2d632b3d9e 100644 --- a/android/src/main/AndroidManifest.xml +++ b/android/src/main/AndroidManifest.xml @@ -1,3 +1,9 @@ + package="com.brentvatne.react"> + + + + From 32880544e5aa7424067feefa6f947b3e0e5b6688 Mon Sep 17 00:00:00 2001 From: Tuan Luong Date: Sat, 4 Jul 2020 22:08:57 +0700 Subject: [PATCH 010/388] update manifest and import --- .../src/main/AndroidManifest.xml | 5 ++++ .../exoplayer/ReactExoplayerView.java | 28 ++++++------------- android/src/main/AndroidManifest.xml | 6 ---- 3 files changed, 14 insertions(+), 25 deletions(-) diff --git a/android-exoplayer/src/main/AndroidManifest.xml b/android-exoplayer/src/main/AndroidManifest.xml index 3535ad445f..39515895c2 100644 --- a/android-exoplayer/src/main/AndroidManifest.xml +++ b/android-exoplayer/src/main/AndroidManifest.xml @@ -1,3 +1,8 @@ + + + diff --git a/android-exoplayer/src/main/java/com/brentvatne/exoplayer/ReactExoplayerView.java b/android-exoplayer/src/main/java/com/brentvatne/exoplayer/ReactExoplayerView.java index 6cd6b84498..5d546877d8 100644 --- a/android-exoplayer/src/main/java/com/brentvatne/exoplayer/ReactExoplayerView.java +++ b/android-exoplayer/src/main/java/com/brentvatne/exoplayer/ReactExoplayerView.java @@ -12,10 +12,7 @@ import android.view.View; import android.view.accessibility.CaptioningManager; import android.widget.FrameLayout; - -import androidx.fragment.app.Fragment; -import androidx.fragment.app.FragmentActivity; -import androidx.fragment.app.FragmentTransaction; +import android.widget.ImageButton; import com.brentvatne.react.R; import com.brentvatne.receiver.AudioBecomingNoisyReceiver; @@ -27,33 +24,28 @@ import com.facebook.react.bridge.ReadableMap; import com.facebook.react.bridge.WritableArray; import com.facebook.react.bridge.WritableMap; -import com.facebook.react.modules.timepicker.TimePickerDialogFragment; -import com.facebook.react.uimanager.NativeViewHierarchyManager; import com.facebook.react.uimanager.ThemedReactContext; -import com.facebook.react.uimanager.UIBlock; -import com.facebook.react.uimanager.UIManagerModule; import com.google.android.exoplayer2.C; import com.google.android.exoplayer2.DefaultLoadControl; +import com.google.android.exoplayer2.DefaultRenderersFactory; import com.google.android.exoplayer2.ExoPlaybackException; -import com.google.android.exoplayer2.ExoPlayer; import com.google.android.exoplayer2.ExoPlayerFactory; import com.google.android.exoplayer2.Format; import com.google.android.exoplayer2.PlaybackParameters; import com.google.android.exoplayer2.Player; import com.google.android.exoplayer2.SimpleExoPlayer; import com.google.android.exoplayer2.Timeline; -import com.google.android.exoplayer2.extractor.DefaultExtractorsFactory; import com.google.android.exoplayer2.mediacodec.MediaCodecRenderer; import com.google.android.exoplayer2.mediacodec.MediaCodecUtil; import com.google.android.exoplayer2.metadata.Metadata; -import com.google.android.exoplayer2.metadata.MetadataRenderer; +import com.google.android.exoplayer2.metadata.MetadataOutput; import com.google.android.exoplayer2.source.BehindLiveWindowException; -import com.google.android.exoplayer2.source.ExtractorMediaSource; import com.google.android.exoplayer2.source.MediaSource; import com.google.android.exoplayer2.source.MergingMediaSource; +import com.google.android.exoplayer2.source.ProgressiveMediaSource; import com.google.android.exoplayer2.source.SingleSampleMediaSource; -import com.google.android.exoplayer2.source.TrackGroupArray; import com.google.android.exoplayer2.source.TrackGroup; +import com.google.android.exoplayer2.source.TrackGroupArray; import com.google.android.exoplayer2.source.dash.DashMediaSource; import com.google.android.exoplayer2.source.dash.DefaultDashChunkSource; import com.google.android.exoplayer2.source.hls.HlsMediaSource; @@ -64,21 +56,19 @@ import com.google.android.exoplayer2.trackselection.MappingTrackSelector; import com.google.android.exoplayer2.trackselection.TrackSelection; import com.google.android.exoplayer2.trackselection.TrackSelectionArray; +import com.google.android.exoplayer2.ui.PlayerControlView; +import com.google.android.exoplayer2.upstream.BandwidthMeter; import com.google.android.exoplayer2.upstream.DataSource; import com.google.android.exoplayer2.upstream.DefaultAllocator; -import com.google.android.exoplayer2.upstream.BandwidthMeter; import com.google.android.exoplayer2.upstream.DefaultBandwidthMeter; +import com.google.android.exoplayer2.upstream.HttpDataSource; import com.google.android.exoplayer2.util.Util; -import com.google.android.exoplayer2.ui.PlayerControlView; import java.net.CookieHandler; import java.net.CookieManager; import java.net.CookiePolicy; -import java.lang.Math; -import java.util.HashMap; -import java.util.Map; -import java.lang.Object; import java.util.ArrayList; +import java.util.HashMap; import java.util.Locale; import java.util.Map; diff --git a/android/src/main/AndroidManifest.xml b/android/src/main/AndroidManifest.xml index 2d632b3d9e..42a828cc1f 100644 --- a/android/src/main/AndroidManifest.xml +++ b/android/src/main/AndroidManifest.xml @@ -1,9 +1,3 @@ - - - - From 0b7ea71d7707516c8c108f021f70477e962c7bcb Mon Sep 17 00:00:00 2001 From: Tuan Luong Date: Sun, 5 Jul 2020 11:00:25 +0700 Subject: [PATCH 011/388] update fullscreen activity --- .../src/main/AndroidManifest.xml | 3 +- .../ExoPlayerFullscreenVideoActivity.java | 35 +++++++++++++++---- .../exoplayer/ReactExoplayerView.java | 16 ++++++--- 3 files changed, 42 insertions(+), 12 deletions(-) diff --git a/android-exoplayer/src/main/AndroidManifest.xml b/android-exoplayer/src/main/AndroidManifest.xml index 39515895c2..53e507e0c4 100644 --- a/android-exoplayer/src/main/AndroidManifest.xml +++ b/android-exoplayer/src/main/AndroidManifest.xml @@ -3,6 +3,7 @@ + android:configChanges="orientation|keyboardHidden|screenSize" + android:launchMode="singleTop" /> diff --git a/android-exoplayer/src/main/java/com/brentvatne/exoplayer/ExoPlayerFullscreenVideoActivity.java b/android-exoplayer/src/main/java/com/brentvatne/exoplayer/ExoPlayerFullscreenVideoActivity.java index 1f2ee1d5b2..5492145f13 100644 --- a/android-exoplayer/src/main/java/com/brentvatne/exoplayer/ExoPlayerFullscreenVideoActivity.java +++ b/android-exoplayer/src/main/java/com/brentvatne/exoplayer/ExoPlayerFullscreenVideoActivity.java @@ -1,6 +1,7 @@ package com.brentvatne.exoplayer; import android.os.Bundle; +import android.view.KeyEvent; import android.view.View; import android.widget.ImageView; @@ -13,7 +14,6 @@ public class ExoPlayerFullscreenVideoActivity extends AppCompatActivity implements ReactExoplayerView.FullScreenDelegate { public static final String EXTRA_ID = "extra_id"; - public static final String EXTRA_IS_PLAYING = "extra_is_playing"; private int id; private PlayerControlView playerControlView; @@ -36,26 +36,40 @@ public void onCreate(Bundle savedInstanceState) { ImageView fullscreenIcon = playerControlView.findViewById(R.id.exo_fullscreen_icon); fullscreenIcon.setImageResource(R.drawable.exo_controls_fullscreen_exit); playerControlView.findViewById(R.id.exo_fullscreen_button) - .setOnClickListener(v -> finish()); + .setOnClickListener(v -> ReactExoplayerView.getViewInstance(id).setFullscreen(false)); + //Handling the playButton click event + playerControlView.findViewById(R.id.exo_play).setOnClickListener(v -> { + if (player != null && player.getPlaybackState() == Player.STATE_ENDED) { + player.seekTo(0); + } + ReactExoplayerView.getViewInstance(id).setPausedModifier(false); + }); + + //Handling the pauseButton click event + playerControlView.findViewById(R.id.exo_pause).setOnClickListener(v -> ReactExoplayerView.getViewInstance(id).setPausedModifier(true)); } @Override public void onResume() { super.onResume(); - boolean isPlaying = getIntent().getBooleanExtra(EXTRA_IS_PLAYING, false); - player.setPlayWhenReady(isPlaying); + boolean isPaused = ReactExoplayerView.getViewInstance(id).isPaused(); + player.setPlayWhenReady(!isPaused); ReactExoplayerView.getViewInstance(id).registerFullScreenDelegate(this); } @Override public void onPause() { super.onPause(); - boolean isPlaying = player.getPlayWhenReady() && player.getPlaybackState() == Player.STATE_READY; - ReactExoplayerView.getViewInstance(id).setPausedModifier(!isPlaying); player.setPlayWhenReady(false); ReactExoplayerView.getViewInstance(id).registerFullScreenDelegate(null); } + @Override + protected void onDestroy() { + super.onDestroy(); + ReactExoplayerView.getViewInstance(id).removeViewInstance(); + } + @Override public void onWindowFocusChanged(boolean hasFocus) { super.onWindowFocusChanged(hasFocus); @@ -64,6 +78,15 @@ public void onWindowFocusChanged(boolean hasFocus) { } } + @Override + public boolean onKeyDown(int keyCode, KeyEvent event) { + if ((keyCode == KeyEvent.KEYCODE_BACK)) { + ReactExoplayerView.getViewInstance(id).setFullscreen(false); + return false; + } + return super.onKeyDown(keyCode, event); + } + private void togglePlayerControlVisibility() { if (playerControlView.isVisible()) { playerControlView.hide(); diff --git a/android-exoplayer/src/main/java/com/brentvatne/exoplayer/ReactExoplayerView.java b/android-exoplayer/src/main/java/com/brentvatne/exoplayer/ReactExoplayerView.java index 5d546877d8..38bcd827fc 100644 --- a/android-exoplayer/src/main/java/com/brentvatne/exoplayer/ReactExoplayerView.java +++ b/android-exoplayer/src/main/java/com/brentvatne/exoplayer/ReactExoplayerView.java @@ -239,9 +239,13 @@ protected void onDetachedFromWindow() { @Override public void onHostResume() { - exoPlayerView.setPlayer(player); if (!playInBackground || !isInBackground) { - setPlayWhenReady(!isPaused); + if (player != null) { + exoPlayerView.setPlayer(player); + boolean temp = this.disableFocus; + player.setPlayWhenReady(!isPaused); + this.disableFocus = temp; + } } isInBackground = false; } @@ -296,6 +300,10 @@ public void registerFullScreenDelegate(FullScreenDelegate delegate) { this.fullScreenDelegate = delegate; } + public void removeViewInstance() { + instances.remove(uid); + } + // Internal methods /** @@ -315,8 +323,6 @@ private void showFullscreen() { instances.put(uid, this); Intent intent = new Intent(getContext(), ExoPlayerFullscreenVideoActivity.class); intent.putExtra(ExoPlayerFullscreenVideoActivity.EXTRA_ID, this.uid); - boolean isPlaying = player.getPlayWhenReady() && player.getPlaybackState() == Player.STATE_READY; - intent.putExtra(ExoPlayerFullscreenVideoActivity.EXTRA_IS_PLAYING, isPlaying); getContext().startActivity(intent); } @@ -332,7 +338,7 @@ private void initializePlayerControl() { playerControlView.setPlayer(player); playerControlView.show(); playPauseControlContainer = playerControlView.findViewById(R.id.exo_play_pause_container); - playerControlView.findViewById(R.id.exo_fullscreen_button).setOnClickListener(v -> showFullscreen()); + playerControlView.findViewById(R.id.exo_fullscreen_button).setOnClickListener(v -> setFullscreen(true)); // Invoking onClick event for exoplayerView exoPlayerView.setOnClickListener(new OnClickListener() { From 5fe76574bbf30b7ea95fa4308760c12b26377f5e Mon Sep 17 00:00:00 2001 From: Tuan Luong Date: Fri, 10 Jul 2020 10:45:41 +0700 Subject: [PATCH 012/388] add fullscreenOrientation --- README.md | 2 +- .../ExoPlayerFullscreenVideoActivity.java | 33 ++++++++++++------- .../exoplayer/ReactExoplayerView.java | 11 ++++--- .../exoplayer/ReactExoplayerViewManager.java | 6 ++++ 4 files changed, 35 insertions(+), 17 deletions(-) diff --git a/README.md b/README.md index 00fc79321c..3e701aa7cb 100644 --- a/README.md +++ b/README.md @@ -469,7 +469,7 @@ Platforms: iOS * **landscape** * **portrait** -Platforms: iOS +Platforms: Android ExoPlayer, iOS #### headers Pass headers to the HTTP client. Can be used for authorization. Headers must be a part of the source object. diff --git a/android-exoplayer/src/main/java/com/brentvatne/exoplayer/ExoPlayerFullscreenVideoActivity.java b/android-exoplayer/src/main/java/com/brentvatne/exoplayer/ExoPlayerFullscreenVideoActivity.java index 5492145f13..6996eb6c4a 100644 --- a/android-exoplayer/src/main/java/com/brentvatne/exoplayer/ExoPlayerFullscreenVideoActivity.java +++ b/android-exoplayer/src/main/java/com/brentvatne/exoplayer/ExoPlayerFullscreenVideoActivity.java @@ -1,5 +1,6 @@ package com.brentvatne.exoplayer; +import android.content.pm.ActivityInfo; import android.os.Bundle; import android.view.KeyEvent; import android.view.View; @@ -14,7 +15,8 @@ public class ExoPlayerFullscreenVideoActivity extends AppCompatActivity implements ReactExoplayerView.FullScreenDelegate { public static final String EXTRA_ID = "extra_id"; - + public static final String EXTRA_ORIENTATION = "extra_orientation"; + private int id; private PlayerControlView playerControlView; private SimpleExoPlayer player; @@ -22,8 +24,14 @@ public class ExoPlayerFullscreenVideoActivity extends AppCompatActivity implemen @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); - setContentView(R.layout.exo_player_fullscreen_video); id = getIntent().getIntExtra(EXTRA_ID, -1); + String orientation = getIntent().getStringExtra(EXTRA_ORIENTATION); + if ("landscape".equals(orientation)) { + setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR_LANDSCAPE); + } else if ("portrait".equals(orientation)) { + setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR_PORTRAIT); + } + setContentView(R.layout.exo_player_fullscreen_video); player = ReactExoplayerView.getViewInstance(id).getPlayer(); ExoPlayerView playerView = findViewById(R.id.player_view); @@ -54,20 +62,18 @@ public void onResume() { super.onResume(); boolean isPaused = ReactExoplayerView.getViewInstance(id).isPaused(); player.setPlayWhenReady(!isPaused); - ReactExoplayerView.getViewInstance(id).registerFullScreenDelegate(this); + if (ReactExoplayerView.getViewInstance(id) != null) { + ReactExoplayerView.getViewInstance(id).registerFullScreenDelegate(this); + } } @Override public void onPause() { super.onPause(); player.setPlayWhenReady(false); - ReactExoplayerView.getViewInstance(id).registerFullScreenDelegate(null); - } - - @Override - protected void onDestroy() { - super.onDestroy(); - ReactExoplayerView.getViewInstance(id).removeViewInstance(); + if (ReactExoplayerView.getViewInstance(id) != null) { + ReactExoplayerView.getViewInstance(id).registerFullScreenDelegate(null); + } } @Override @@ -81,8 +87,11 @@ public void onWindowFocusChanged(boolean hasFocus) { @Override public boolean onKeyDown(int keyCode, KeyEvent event) { if ((keyCode == KeyEvent.KEYCODE_BACK)) { - ReactExoplayerView.getViewInstance(id).setFullscreen(false); - return false; + if (ReactExoplayerView.getViewInstance(id) != null) { + ReactExoplayerView.getViewInstance(id).setFullscreen(false); + return false; + } + return true; } return super.onKeyDown(keyCode, event); } diff --git a/android-exoplayer/src/main/java/com/brentvatne/exoplayer/ReactExoplayerView.java b/android-exoplayer/src/main/java/com/brentvatne/exoplayer/ReactExoplayerView.java index 38bcd827fc..875d340230 100644 --- a/android-exoplayer/src/main/java/com/brentvatne/exoplayer/ReactExoplayerView.java +++ b/android-exoplayer/src/main/java/com/brentvatne/exoplayer/ReactExoplayerView.java @@ -114,6 +114,7 @@ class ReactExoplayerView extends FrameLayout implements private long resumePosition; private boolean loadVideoStarted; private boolean isFullscreen; + private String fullScreenOrientation; private boolean isInBackground; private boolean isPaused; private boolean isBuffering; @@ -266,6 +267,7 @@ public void onHostDestroy() { public void cleanUpResources() { stopPlayback(); + instances.remove(uid); } //BandwidthMeter.EventListener implementation @@ -300,10 +302,6 @@ public void registerFullScreenDelegate(FullScreenDelegate delegate) { this.fullScreenDelegate = delegate; } - public void removeViewInstance() { - instances.remove(uid); - } - // Internal methods /** @@ -323,6 +321,7 @@ private void showFullscreen() { instances.put(uid, this); Intent intent = new Intent(getContext(), ExoPlayerFullscreenVideoActivity.class); intent.putExtra(ExoPlayerFullscreenVideoActivity.EXTRA_ID, this.uid); + intent.putExtra(ExoPlayerFullscreenVideoActivity.EXTRA_ORIENTATION, this.fullScreenOrientation); getContext().startActivity(intent); } @@ -1268,6 +1267,10 @@ public void setFullscreen(boolean fullscreen) { } } + public void setFullscreenOrientation(String orientation) { + this.fullScreenOrientation = orientation; + } + public void setUseTextureView(boolean useTextureView) { exoPlayerView.setUseTextureView(useTextureView); } diff --git a/android-exoplayer/src/main/java/com/brentvatne/exoplayer/ReactExoplayerViewManager.java b/android-exoplayer/src/main/java/com/brentvatne/exoplayer/ReactExoplayerViewManager.java index cf50fdaecd..d520970d90 100644 --- a/android-exoplayer/src/main/java/com/brentvatne/exoplayer/ReactExoplayerViewManager.java +++ b/android-exoplayer/src/main/java/com/brentvatne/exoplayer/ReactExoplayerViewManager.java @@ -54,6 +54,7 @@ public class ReactExoplayerViewManager extends ViewGroupManager Date: Mon, 13 Jul 2020 14:41:38 +0700 Subject: [PATCH 013/388] do not hide fullscreen in stopPlayback --- .../ExoPlayerFullscreenVideoActivity.java | 3 +- .../exoplayer/ReactExoplayerView.java | 29 ++++++++++++------- 2 files changed, 20 insertions(+), 12 deletions(-) diff --git a/android-exoplayer/src/main/java/com/brentvatne/exoplayer/ExoPlayerFullscreenVideoActivity.java b/android-exoplayer/src/main/java/com/brentvatne/exoplayer/ExoPlayerFullscreenVideoActivity.java index 6996eb6c4a..329a8fda3b 100644 --- a/android-exoplayer/src/main/java/com/brentvatne/exoplayer/ExoPlayerFullscreenVideoActivity.java +++ b/android-exoplayer/src/main/java/com/brentvatne/exoplayer/ExoPlayerFullscreenVideoActivity.java @@ -60,9 +60,8 @@ public void onCreate(Bundle savedInstanceState) { @Override public void onResume() { super.onResume(); - boolean isPaused = ReactExoplayerView.getViewInstance(id).isPaused(); - player.setPlayWhenReady(!isPaused); if (ReactExoplayerView.getViewInstance(id) != null) { + ReactExoplayerView.getViewInstance(id).syncPlayerState(); ReactExoplayerView.getViewInstance(id).registerFullScreenDelegate(this); } } diff --git a/android-exoplayer/src/main/java/com/brentvatne/exoplayer/ReactExoplayerView.java b/android-exoplayer/src/main/java/com/brentvatne/exoplayer/ReactExoplayerView.java index 875d340230..83d703615f 100644 --- a/android-exoplayer/src/main/java/com/brentvatne/exoplayer/ReactExoplayerView.java +++ b/android-exoplayer/src/main/java/com/brentvatne/exoplayer/ReactExoplayerView.java @@ -116,6 +116,7 @@ class ReactExoplayerView extends FrameLayout implements private boolean isFullscreen; private String fullScreenOrientation; private boolean isInBackground; + private boolean isInFullscreen; private boolean isPaused; private boolean isBuffering; private boolean muted = false; @@ -241,11 +242,14 @@ protected void onDetachedFromWindow() { @Override public void onHostResume() { if (!playInBackground || !isInBackground) { - if (player != null) { - exoPlayerView.setPlayer(player); - boolean temp = this.disableFocus; - player.setPlayWhenReady(!isPaused); - this.disableFocus = temp; + if (isInFullscreen) { + if (player != null) { + exoPlayerView.setPlayer(player); + syncPlayerState(); + } + isInFullscreen = false; + } else { + setPlayWhenReady(!isPaused); } } isInBackground = false; @@ -294,8 +298,15 @@ public SimpleExoPlayer getPlayer() { return player; } - public boolean isPaused() { - return isPaused; + public void syncPlayerState() { + if (player == null) return; + if (player.getPlaybackState() == Player.STATE_ENDED) { + // Try to get last frame displayed + player.seekTo(player.getDuration() - 200); + player.setPlayWhenReady(true); + } else { + player.setPlayWhenReady(!isPaused); + } } public void registerFullScreenDelegate(FullScreenDelegate delegate) { @@ -323,6 +334,7 @@ private void showFullscreen() { intent.putExtra(ExoPlayerFullscreenVideoActivity.EXTRA_ID, this.uid); intent.putExtra(ExoPlayerFullscreenVideoActivity.EXTRA_ORIENTATION, this.fullScreenOrientation); getContext().startActivity(intent); + isInFullscreen = true; } /** @@ -623,9 +635,6 @@ private void stopPlayback() { } private void onStopPlayback() { - if (isFullscreen) { - setFullscreen(false); - } audioManager.abandonAudioFocus(this); } From 4d35511fb98f5494fc915502f5fe7799237ab724 Mon Sep 17 00:00:00 2001 From: Tuan Luong Date: Mon, 13 Jul 2020 14:50:09 +0700 Subject: [PATCH 014/388] add delay when hideSystemUI --- .../brentvatne/exoplayer/ExoPlayerFullscreenVideoActivity.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/android-exoplayer/src/main/java/com/brentvatne/exoplayer/ExoPlayerFullscreenVideoActivity.java b/android-exoplayer/src/main/java/com/brentvatne/exoplayer/ExoPlayerFullscreenVideoActivity.java index 329a8fda3b..d3b8720801 100644 --- a/android-exoplayer/src/main/java/com/brentvatne/exoplayer/ExoPlayerFullscreenVideoActivity.java +++ b/android-exoplayer/src/main/java/com/brentvatne/exoplayer/ExoPlayerFullscreenVideoActivity.java @@ -79,7 +79,7 @@ public void onPause() { public void onWindowFocusChanged(boolean hasFocus) { super.onWindowFocusChanged(hasFocus); if (hasFocus) { - hideSystemUI(); + playerControlView.postDelayed(this::hideSystemUI, 200); } } From 5f1ec04cef478545507ab149411ee7cb331860ba Mon Sep 17 00:00:00 2001 From: Alec Winograd Date: Thu, 15 Oct 2020 11:17:49 -0500 Subject: [PATCH 015/388] Fix default behavior for captions in ExoPlayer --- .../main/java/com/brentvatne/exoplayer/ReactExoplayerView.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/android-exoplayer/src/main/java/com/brentvatne/exoplayer/ReactExoplayerView.java b/android-exoplayer/src/main/java/com/brentvatne/exoplayer/ReactExoplayerView.java index b41b2768ff..652178b103 100644 --- a/android-exoplayer/src/main/java/com/brentvatne/exoplayer/ReactExoplayerView.java +++ b/android-exoplayer/src/main/java/com/brentvatne/exoplayer/ReactExoplayerView.java @@ -1134,7 +1134,7 @@ public void setSelectedTrack(int trackType, String type, Dynamic value) { } } } - } else if (rendererIndex == C.TRACK_TYPE_TEXT && Util.SDK_INT > 18) { // Text default + } else if (trackType == C.TRACK_TYPE_TEXT && Util.SDK_INT > 18) { // Text default // Use system settings if possible CaptioningManager captioningManager = (CaptioningManager)themedReactContext.getSystemService(Context.CAPTIONING_SERVICE); From 42deedc8d1056ffc6a8d454e28ce449a400add3e Mon Sep 17 00:00:00 2001 From: Alec Winograd Date: Thu, 15 Oct 2020 11:24:46 -0500 Subject: [PATCH 016/388] Update changelog --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 53e2518cf7..9ca56b485f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,7 @@ ### Version 5.1.0-alpha9 - Add ARM64 support for windows [#2137](https://github.com/react-native-community/react-native-video/pull/2137) +- Fix default closed captioning behavior for Android ExoPlayer [#2181](https://github.com/react-native-video/react-native-video/pull/2181) ### Version 5.1.0-alpha8 From 991f94b22842c842d7e522904b23a0dfd995002a Mon Sep 17 00:00:00 2001 From: Mudaser Ali Date: Fri, 16 Oct 2020 18:54:50 +0500 Subject: [PATCH 017/388] Update README.md --- README.md | 91 ++++++++++++++++++++++++++++--------------------------- 1 file changed, 47 insertions(+), 44 deletions(-) diff --git a/README.md b/README.md index 1b6a913ec3..0a24a86804 100644 --- a/README.md +++ b/README.md @@ -101,11 +101,11 @@ First select your project in Xcode. -After that, select the tvOS target of your application and select « General » tab +After that, select the tvOS target of your application and select « General » tab -Scroll to « Linked Frameworks and Libraries » and tap on the + button +Scroll to « Linked Frameworks and Libraries » and tap on the + button @@ -273,48 +273,51 @@ var styles = StyleSheet.create({ ``` ### Configurable props -* [allowsExternalPlayback](#allowsexternalplayback) -* [audioOnly](#audioonly) -* [automaticallyWaitsToMinimizeStalling](#automaticallyWaitsToMinimizeStalling) -* [bufferConfig](#bufferconfig) -* [controls](#controls) -* [currentPlaybackTime](#currentPlaybackTime) -* [disableFocus](#disableFocus) -* [filter](#filter) -* [filterEnabled](#filterEnabled) -* [fullscreen](#fullscreen) -* [fullscreenAutorotate](#fullscreenautorotate) -* [fullscreenOrientation](#fullscreenorientation) -* [headers](#headers) -* [hideShutterView](#hideshutterview) -* [id](#id) -* [ignoreSilentSwitch](#ignoresilentswitch) -* [maxBitRate](#maxbitrate) -* [minLoadRetryCount](#minLoadRetryCount) -* [mixWithOthers](#mixWithOthers) -* [muted](#muted) -* [paused](#paused) -* [pictureInPicture](#pictureinpicture) -* [playInBackground](#playinbackground) -* [playWhenInactive](#playwheninactive) -* [poster](#poster) -* [posterResizeMode](#posterresizemode) -* [preferredForwardBufferDuration](#preferredForwardBufferDuration) -* [preventsDisplaySleepDuringVideoPlayback](#preventsDisplaySleepDuringVideoPlayback) -* [progressUpdateInterval](#progressupdateinterval) -* [rate](#rate) -* [repeat](#repeat) -* [reportBandwidth](#reportbandwidth) -* [resizeMode](#resizemode) -* [selectedAudioTrack](#selectedaudiotrack) -* [selectedTextTrack](#selectedtexttrack) -* [selectedVideoTrack](#selectedvideotrack) -* [source](#source) -* [stereoPan](#stereopan) -* [textTracks](#texttracks) -* [trackId](#trackId) -* [useTextureView](#usetextureview) -* [volume](#volume) +| Prop Name |Plateforms Support | +|--|--| +|[allowsExternalPlayback](#allowsexternalplayback) |iOS | +|[audioOnly](#audioonly)|All | +|[automaticallyWaitsToMinimizeStalling](#automaticallyWaitsToMinimizeStalling) | iOS| +|[bufferConfig](#bufferconfig)|Android ExoPlayer| +|[controls](#controls)|Android ExoPlayer, iOS, react-native-dom| +|[currentPlaybackTime](#currentPlaybackTime)|Android Exoplayer| +|[disableFocus](#disableFocus)|Android Exoplayer, iOS| +|[filter](#filter)|iOS| +|[filterEnabled](#filterEnabled)|iOS| +|[fullscreen](#fullscreen)|iOS| +|[fullscreenAutorotate](#fullscreenautorotate)|iOS| +|[fullscreenOrientation](#fullscreenorientation)|iOS| +|[headers](#headers)|Android ExoPlayer| +|[hideShutterView](#hideshutterview)|Android ExoPlayer| +|[id](#id)|react-native-dom| +|[ignoreSilentSwitch](#ignoresilentswitch)|iOS| +|[maxBitRate](#maxbitrate)|Android ExoPlayer, iOS| +|[minLoadRetryCount](#minLoadRetryCount)|Android ExoPlayer| +|[mixWithOthers](#mixWithOthers)|iOS| +|[muted](#muted)|All| +|[paused](#paused)|All| +|[pictureInPicture](#pictureinpicture)|iOS| +|[playInBackground](#playinbackground)|Android ExoPlayer, Android MediaPlayer, iOS| +|[playWhenInactive](#playwheninactive)|iOS| +|[poster](#poster)|All| +|[posterResizeMode](#posterresizemode)|All| +|[preferredForwardBufferDuration](#preferredForwardBufferDuration)|iOS| +| [preventsDisplaySleepDuringVideoPlayback](#preventsDisplaySleepDuringVideoPlayback)|iOS, Android| +|[progressUpdateInterval](#progressupdateinterval)|All| +|[rate](#rate)|All| +|[repeat](#repeat)|All| +|[reportBandwidth](#reportbandwidth)|Android ExoPlayer| +|[resizeMode](#resizemode)|Android ExoPlayer, Android MediaPlayer, iOS, Windows UWP| +|[selectedAudioTrack](#selectedaudiotrack)|Android ExoPlayer, iOS| +|[selectedTextTrack](#selectedtexttrack)|Android ExoPlayer, iOS| +|[selectedVideoTrack](#selectedvideotrack)|Android ExoPlayer| +|[source](#source)|All| +|[stereoPan](#stereopan)|Android MediaPlayer| +|[textTracks](#texttracks)|Android ExoPlayer, iOS| +|[trackId](#trackId)|Android ExoPlayer| +|[useTextureView](#usetextureview)|Android ExoPlayer| +|[volume](#volume)|All| + ### Event props * [onAudioBecomingNoisy](#onaudiobecomingnoisy) From 2dea87c2207d0bb90e7a2ac859a8191778ab7e3f Mon Sep 17 00:00:00 2001 From: Mudaser Ali Date: Sat, 17 Oct 2020 08:54:44 +0500 Subject: [PATCH 018/388] Update Event props in README.md --- README.md | 37 ++++++++++++++++++++----------------- 1 file changed, 20 insertions(+), 17 deletions(-) diff --git a/README.md b/README.md index 0a24a86804..bc845dee26 100644 --- a/README.md +++ b/README.md @@ -320,23 +320,26 @@ var styles = StyleSheet.create({ ### Event props -* [onAudioBecomingNoisy](#onaudiobecomingnoisy) -* [onBandwidthUpdate](#onbandwidthupdate) -* [onEnd](#onend) -* [onExternalPlaybackChange](#onexternalplaybackchange) -* [onFullscreenPlayerWillPresent](#onfullscreenplayerwillpresent) -* [onFullscreenPlayerDidPresent](#onfullscreenplayerdidpresent) -* [onFullscreenPlayerWillDismiss](#onfullscreenplayerwilldismiss) -* [onFullscreenPlayerDidDismiss](#onfullscreenplayerdiddismiss) -* [onLoad](#onload) -* [onLoadStart](#onloadstart) -* [onReadyForDisplay](#onreadyfordisplay) -* [onPictureInPictureStatusChanged](#onpictureinpicturestatuschanged) -* [onPlaybackRateChange](#onplaybackratechange) -* [onProgress](#onprogress) -* [onSeek](#onseek) -* [onRestoreUserInterfaceForPictureInPictureStop](#onrestoreuserinterfaceforpictureinpicturestop) -* [onTimedMetadata](#ontimedmetadata) +| Prop Name |Plateforms Support | +|--|--| +|[onAudioBecomingNoisy](#onaudiobecomingnoisy)|Android ExoPlayer, iOS| +|[onBandwidthUpdate](#onbandwidthupdate)|Android ExoPlayer| +|[onEnd](#onend)|All| +|[onExternalPlaybackChange](#onexternalplaybackchange)|iOS| +|[onFullscreenPlayerWillPresent](#onfullscreenplayerwillpresent)|Android ExoPlayer, Android MediaPlayer, iOS| +|[onFullscreenPlayerDidPresent](#onfullscreenplayerdidpresent)|Android ExoPlayer, Android MediaPlayer, iOS| +|[onFullscreenPlayerWillDismiss](#onfullscreenplayerwilldismiss)|Android ExoPlayer, Android MediaPlayer, iOS| +|[onFullscreenPlayerDidDismiss](#onfullscreenplayerdiddismiss)|Android ExoPlayer, Android MediaPlayer, iOS| +|[onLoad](#onload)|All| +|[onLoadStart](#onloadstart)|All| +|[onReadyForDisplay](#onreadyfordisplay)|Android ExoPlayer, Android MediaPlayer, iOS, Web| +|[onPictureInPictureStatusChanged](#onpictureinpicturestatuschanged)|iOS| +|[onPlaybackRateChange](#onplaybackratechange)|All| +|[onProgress](#onprogress)|All| +|[onSeek](#onseek)|Android ExoPlayer, Android MediaPlayer, iOS, Windows UWP| +|[onRestoreUserInterfaceForPictureInPictureStop](#onrestoreuserinterfaceforpictureinpicturestop)|iOS| +|[onTimedMetadata](#ontimedmetadata)|Android ExoPlayer, Android MediaPlayer, iOS| + ### Methods * [dismissFullscreenPlayer](#dismissfullscreenplayer) From 38511bbf1c213a2defd8b1f3e5a4991183d572e3 Mon Sep 17 00:00:00 2001 From: Mudaser Ali Date: Sat, 17 Oct 2020 08:58:05 +0500 Subject: [PATCH 019/388] Update Method List --- README.md | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index bc845dee26..ab509e1b32 100644 --- a/README.md +++ b/README.md @@ -342,11 +342,14 @@ var styles = StyleSheet.create({ ### Methods -* [dismissFullscreenPlayer](#dismissfullscreenplayer) -* [presentFullscreenPlayer](#presentfullscreenplayer) -* [save](#save) -* [restoreUserInterfaceForPictureInPictureStop](#restoreuserinterfaceforpictureinpicturestop) -* [seek](#seek) +| Method Name |Plateforms Support | +|--|--| +|[dismissFullscreenPlayer](#dismissfullscreenplayer)|Android ExoPlayer, Android MediaPlayer, iOS| +|[presentFullscreenPlayer](#presentfullscreenplayer)|Android ExoPlayer, Android MediaPlayer, iOS| +|[save](#save)|iOS| +|[restoreUserInterfaceForPictureInPictureStop](#restoreuserinterfaceforpictureinpicturestop)|iOS| +|[seek](#seek)|All| + ### Configurable props From e17ee74f79ca28f0180c2bfdac8136b7045657e2 Mon Sep 17 00:00:00 2001 From: Mudaser Ali Date: Sat, 17 Oct 2020 08:59:12 +0500 Subject: [PATCH 020/388] Update README.md --- README.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index ab509e1b32..5966b37e4f 100644 --- a/README.md +++ b/README.md @@ -273,7 +273,7 @@ var styles = StyleSheet.create({ ``` ### Configurable props -| Prop Name |Plateforms Support | +| Name |Plateforms Support | |--|--| |[allowsExternalPlayback](#allowsexternalplayback) |iOS | |[audioOnly](#audioonly)|All | @@ -320,7 +320,7 @@ var styles = StyleSheet.create({ ### Event props -| Prop Name |Plateforms Support | +| Name |Plateforms Support | |--|--| |[onAudioBecomingNoisy](#onaudiobecomingnoisy)|Android ExoPlayer, iOS| |[onBandwidthUpdate](#onbandwidthupdate)|Android ExoPlayer| @@ -342,7 +342,7 @@ var styles = StyleSheet.create({ ### Methods -| Method Name |Plateforms Support | +| Name |Plateforms Support | |--|--| |[dismissFullscreenPlayer](#dismissfullscreenplayer)|Android ExoPlayer, Android MediaPlayer, iOS| |[presentFullscreenPlayer](#presentfullscreenplayer)|Android ExoPlayer, Android MediaPlayer, iOS| From 568971be7735ce5022c5c2691d5efd399aa4012b Mon Sep 17 00:00:00 2001 From: Armands Malejev Date: Mon, 15 Mar 2021 16:51:16 +0200 Subject: [PATCH 021/388] Fix AudoFocus pausing video when attempting to play (#1) Fix AudioFocus bug that could cause the player to stop responding to play/pause in some instances. Fixes issue react-native-video#1945 This was caused by the player requesting audio focus on each play (un-pause) and that resulted in a small window of Audio focus loss and then gain. The focus loss results in the player being paused while the player was supposed to play at the time. The solution is to keep track of Audio focus and not request new focus if we already have it. --- CHANGELOG.md | 2 ++ .../com/brentvatne/exoplayer/ReactExoplayerView.java | 9 ++++++--- 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 53e2518cf7..731db2e81d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,7 @@ ## Changelog +- Fix Android AudioFocus bug that could cause player to not respond to play/pause in some instances [#2311](https://github.com/react-native-video/react-native-video/pull/2311) + ### Version 5.1.0-alpha9 - Add ARM64 support for windows [#2137](https://github.com/react-native-community/react-native-video/pull/2137) diff --git a/android-exoplayer/src/main/java/com/brentvatne/exoplayer/ReactExoplayerView.java b/android-exoplayer/src/main/java/com/brentvatne/exoplayer/ReactExoplayerView.java index b41b2768ff..20ce983a65 100644 --- a/android-exoplayer/src/main/java/com/brentvatne/exoplayer/ReactExoplayerView.java +++ b/android-exoplayer/src/main/java/com/brentvatne/exoplayer/ReactExoplayerView.java @@ -122,6 +122,7 @@ class ReactExoplayerView extends FrameLayout implements private boolean isPaused; private boolean isBuffering; private boolean muted = false; + private boolean hasAudioFocus = false; private float rate = 1f; private float audioVolume = 1f; private int minLoadRetryCount = 3; @@ -567,7 +568,7 @@ private void releasePlayer() { } private boolean requestAudioFocus() { - if (disableFocus || srcUri == null) { + if (disableFocus || srcUri == null || this.hasAudioFocus) { return true; } int result = audioManager.requestAudioFocus(this, @@ -582,8 +583,8 @@ private void setPlayWhenReady(boolean playWhenReady) { } if (playWhenReady) { - boolean hasAudioFocus = requestAudioFocus(); - if (hasAudioFocus) { + this.hasAudioFocus = requestAudioFocus(); + if (this.hasAudioFocus) { player.setPlayWhenReady(true); } } else { @@ -678,6 +679,7 @@ private HttpDataSource.Factory buildHttpDataSourceFactory(boolean useBandwidthMe public void onAudioFocusChange(int focusChange) { switch (focusChange) { case AudioManager.AUDIOFOCUS_LOSS: + this.hasAudioFocus = false; eventEmitter.audioFocusChanged(false); pausePlayback(); audioManager.abandonAudioFocus(this); @@ -686,6 +688,7 @@ public void onAudioFocusChange(int focusChange) { eventEmitter.audioFocusChanged(false); break; case AudioManager.AUDIOFOCUS_GAIN: + this.hasAudioFocus = true; eventEmitter.audioFocusChanged(true); break; default: From 61009817603b3440cb0d00dda47633d26f11f239 Mon Sep 17 00:00:00 2001 From: Armands Malejev Date: Wed, 17 Mar 2021 17:49:10 +0200 Subject: [PATCH 022/388] Upgrade exoplayer to 2.13.2 (#2) Upgrade ExoPlayer from 2.11.4 to 2.13.2 and fix any related issues related to the upgrade and deprecated method use. --- android-exoplayer/build.gradle | 4 +- .../brentvatne/exoplayer/ExoPlayerView.java | 15 ++-- .../exoplayer/ReactExoplayerView.java | 72 ++++++++++--------- 3 files changed, 50 insertions(+), 41 deletions(-) diff --git a/android-exoplayer/build.gradle b/android-exoplayer/build.gradle index 296e21cb56..cebc9df352 100644 --- a/android-exoplayer/build.gradle +++ b/android-exoplayer/build.gradle @@ -28,7 +28,7 @@ android { dependencies { implementation "com.facebook.react:react-native:${safeExtGet('reactNativeVersion', '+')}" - implementation('com.google.android.exoplayer:exoplayer:2.11.4') { + implementation('com.google.android.exoplayer:exoplayer:2.13.2') { exclude group: 'com.android.support' } @@ -37,7 +37,7 @@ dependencies { implementation "androidx.core:core:1.1.0" implementation "androidx.media:media:1.1.0" - implementation('com.google.android.exoplayer:extension-okhttp:2.11.4') { + implementation('com.google.android.exoplayer:extension-okhttp:2.13.2') { exclude group: 'com.squareup.okhttp3', module: 'okhttp' } implementation 'com.squareup.okhttp3:okhttp:3.14.3' diff --git a/android-exoplayer/src/main/java/com/brentvatne/exoplayer/ExoPlayerView.java b/android-exoplayer/src/main/java/com/brentvatne/exoplayer/ExoPlayerView.java index afa5106c19..99446bde5e 100644 --- a/android-exoplayer/src/main/java/com/brentvatne/exoplayer/ExoPlayerView.java +++ b/android-exoplayer/src/main/java/com/brentvatne/exoplayer/ExoPlayerView.java @@ -17,6 +17,7 @@ import com.google.android.exoplayer2.ExoPlayer; import com.google.android.exoplayer2.PlaybackParameters; import com.google.android.exoplayer2.SimpleExoPlayer; +import com.google.android.exoplayer2.video.VideoListener; import com.google.android.exoplayer2.Timeline; import com.google.android.exoplayer2.source.TrackGroupArray; import com.google.android.exoplayer2.text.Cue; @@ -113,8 +114,8 @@ private void updateShutterViewVisibility() { } /** - * Set the {@link SimpleExoPlayer} to use. The {@link SimpleExoPlayer#setTextOutput} and - * {@link SimpleExoPlayer#setVideoListener} method of the player will be called and previous + * Set the {@link SimpleExoPlayer} to use. The {@link SimpleExoPlayer#addTextOutput} and + * {@link SimpleExoPlayer#addVideoListener} method of the player will be called and previous * assignments are overridden. * * @param player The {@link SimpleExoPlayer} to use. @@ -124,8 +125,8 @@ public void setPlayer(SimpleExoPlayer player) { return; } if (this.player != null) { - this.player.setTextOutput(null); - this.player.setVideoListener(null); + this.player.addTextOutput(null); + this.player.removeVideoListener(componentListener); this.player.removeListener(componentListener); this.player.setVideoSurface(null); } @@ -133,9 +134,9 @@ public void setPlayer(SimpleExoPlayer player) { shutterView.setVisibility(VISIBLE); if (player != null) { setVideoView(); - player.setVideoListener(componentListener); + player.addVideoListener(componentListener); player.addListener(componentListener); - player.setTextOutput(componentListener); + player.addTextOutput(componentListener); } } @@ -205,7 +206,7 @@ public void invalidateAspectRatio() { layout.invalidateAspectRatio(); } - private final class ComponentListener implements SimpleExoPlayer.VideoListener, + private final class ComponentListener implements VideoListener, TextOutput, ExoPlayer.EventListener { // TextRenderer.Output implementation diff --git a/android-exoplayer/src/main/java/com/brentvatne/exoplayer/ReactExoplayerView.java b/android-exoplayer/src/main/java/com/brentvatne/exoplayer/ReactExoplayerView.java index 20ce983a65..d7c33214da 100644 --- a/android-exoplayer/src/main/java/com/brentvatne/exoplayer/ReactExoplayerView.java +++ b/android-exoplayer/src/main/java/com/brentvatne/exoplayer/ReactExoplayerView.java @@ -37,7 +37,7 @@ import com.google.android.exoplayer2.SimpleExoPlayer; import com.google.android.exoplayer2.Timeline; import com.google.android.exoplayer2.drm.DefaultDrmSessionManager; -import com.google.android.exoplayer2.drm.DefaultDrmSessionEventListener; +import com.google.android.exoplayer2.drm.DrmSessionEventListener; import com.google.android.exoplayer2.drm.DrmSessionManager; import com.google.android.exoplayer2.drm.FrameworkMediaCrypto; import com.google.android.exoplayer2.drm.FrameworkMediaDrm; @@ -62,7 +62,7 @@ import com.google.android.exoplayer2.trackselection.AdaptiveTrackSelection; import com.google.android.exoplayer2.trackselection.DefaultTrackSelector; import com.google.android.exoplayer2.trackselection.MappingTrackSelector; -import com.google.android.exoplayer2.trackselection.TrackSelection; +import com.google.android.exoplayer2.trackselection.ExoTrackSelection; import com.google.android.exoplayer2.trackselection.TrackSelectionArray; import com.google.android.exoplayer2.ui.PlayerControlView; import com.google.android.exoplayer2.upstream.BandwidthMeter; @@ -88,7 +88,7 @@ class ReactExoplayerView extends FrameLayout implements BecomingNoisyListener, AudioManager.OnAudioFocusChangeListener, MetadataOutput, - DefaultDrmSessionEventListener { + DrmSessionEventListener { private static final String TAG = "ReactExoplayerView"; @@ -395,7 +395,7 @@ private void initializePlayer() { @Override public void run() { if (player == null) { - TrackSelection.Factory videoTrackSelectionFactory = new AdaptiveTrackSelection.Factory(); + ExoTrackSelection.Factory videoTrackSelectionFactory = new AdaptiveTrackSelection.Factory(); trackSelector = new DefaultTrackSelector(videoTrackSelectionFactory); trackSelector.setParameters(trackSelector.buildUponParameters() .setMaxVideoBitrate(maxBitRate == 0 ? Integer.MAX_VALUE : maxBitRate)); @@ -410,8 +410,27 @@ public void run() { DefaultRenderersFactory renderersFactory = new DefaultRenderersFactory(getContext()) .setExtensionRendererMode(DefaultRenderersFactory.EXTENSION_RENDERER_MODE_OFF); + player = new SimpleExoPlayer.Builder(getContext(), renderersFactory) + .setTrackSelector​(trackSelector) + .setBandwidthMeter(bandwidthMeter) + .setLoadControl(defaultLoadControl) + .build(); + player.addListener(self); + player.addMetadataOutput(self); + exoPlayerView.setPlayer(player); + audioBecomingNoisyReceiver.setListener(self); + bandwidthMeter.addEventListener(new Handler(), self); + setPlayWhenReady(!isPaused); + playerNeedsSource = true; + + PlaybackParameters params = new PlaybackParameters(rate, 1f); + player.setPlaybackParameters(params); + } + if (playerNeedsSource && srcUri != null) { + exoPlayerView.invalidateAspectRatio(); + // DRM - DrmSessionManager drmSessionManager = null; + DrmSessionManager drmSessionManager = null; if (self.drmUUID != null) { try { drmSessionManager = buildDrmSessionManager(self.drmUUID, self.drmLicenseUrl, @@ -425,24 +444,9 @@ public void run() { } } // End DRM - player = ExoPlayerFactory.newSimpleInstance(getContext(), renderersFactory, - trackSelector, defaultLoadControl, drmSessionManager, bandwidthMeter); - player.addListener(self); - player.addMetadataOutput(self); - exoPlayerView.setPlayer(player); - audioBecomingNoisyReceiver.setListener(self); - bandwidthMeter.addEventListener(new Handler(), self); - setPlayWhenReady(!isPaused); - playerNeedsSource = true; - - PlaybackParameters params = new PlaybackParameters(rate, 1f); - player.setPlaybackParameters(params); - } - if (playerNeedsSource && srcUri != null) { - exoPlayerView.invalidateAspectRatio(); ArrayList mediaSourceList = buildTextSources(); - MediaSource videoSource = buildMediaSource(srcUri, extension); + MediaSource videoSource = buildMediaSource(srcUri, extension, drmSessionManager); MediaSource mediaSource; if (mediaSourceList.size() == 0) { mediaSource = videoSource; @@ -473,7 +477,7 @@ public void run() { }, 1); } - private DrmSessionManager buildDrmSessionManager(UUID uuid, + private DrmSessionManager buildDrmSessionManager(UUID uuid, String licenseUrl, String[] keyRequestPropertiesArray) throws UnsupportedDrmException { if (Util.SDK_INT < 18) { return null; @@ -486,11 +490,11 @@ private DrmSessionManager buildDrmSessionManager(UUID uuid keyRequestPropertiesArray[i + 1]); } } - return new DefaultDrmSessionManager<>(uuid, + return new DefaultDrmSessionManager(uuid, FrameworkMediaDrm.newInstance(uuid), drmCallback, null, false, 3); } - private MediaSource buildMediaSource(Uri uri, String overrideExtension) { + private MediaSource buildMediaSource(Uri uri, String overrideExtension, DrmSessionManager drmSessionManager) { int type = Util.inferContentType(!TextUtils.isEmpty(overrideExtension) ? "." + overrideExtension : uri.getLastPathSegment()); switch (type) { @@ -498,26 +502,30 @@ private MediaSource buildMediaSource(Uri uri, String overrideExtension) { return new SsMediaSource.Factory( new DefaultSsChunkSource.Factory(mediaDataSourceFactory), buildDataSourceFactory(false) - ).setLoadErrorHandlingPolicy( + ).setDrmSessionManager(drmSessionManager) + .setLoadErrorHandlingPolicy( config.buildLoadErrorHandlingPolicy(minLoadRetryCount) ).createMediaSource(uri); case C.TYPE_DASH: return new DashMediaSource.Factory( new DefaultDashChunkSource.Factory(mediaDataSourceFactory), buildDataSourceFactory(false) - ).setLoadErrorHandlingPolicy( + ).setDrmSessionManager(drmSessionManager) + .setLoadErrorHandlingPolicy( config.buildLoadErrorHandlingPolicy(minLoadRetryCount) ).createMediaSource(uri); case C.TYPE_HLS: return new HlsMediaSource.Factory( mediaDataSourceFactory - ).setLoadErrorHandlingPolicy( + ).setDrmSessionManager(drmSessionManager) + .setLoadErrorHandlingPolicy( config.buildLoadErrorHandlingPolicy(minLoadRetryCount) ).createMediaSource(uri); case C.TYPE_OTHER: return new ProgressiveMediaSource.Factory( mediaDataSourceFactory - ).setLoadErrorHandlingPolicy( + ).setDrmSessionManager(drmSessionManager) + .setLoadErrorHandlingPolicy( config.buildLoadErrorHandlingPolicy(minLoadRetryCount) ).createMediaSource(uri); default: { @@ -1339,23 +1347,23 @@ public void setDrmLicenseHeader(String[] header){ @Override - public void onDrmKeysLoaded() { + public void onDrmKeysLoaded(int windowIndex, MediaSource.MediaPeriodId mediaPeriodId) { Log.d("DRM Info", "onDrmKeysLoaded"); } @Override - public void onDrmSessionManagerError(Exception e) { + public void onDrmSessionManagerError(int windowIndex, MediaSource.MediaPeriodId mediaPeriodId, Exception e) { Log.d("DRM Info", "onDrmSessionManagerError"); eventEmitter.error("onDrmSessionManagerError", e); } @Override - public void onDrmKeysRestored() { + public void onDrmKeysRestored(int windowIndex, MediaSource.MediaPeriodId mediaPeriodId) { Log.d("DRM Info", "onDrmKeysRestored"); } @Override - public void onDrmKeysRemoved() { + public void onDrmKeysRemoved(int windowIndex, MediaSource.MediaPeriodId mediaPeriodId) { Log.d("DRM Info", "onDrmKeysRemoved"); } From 61e6535b2f9b31eccae7b1b653515a1668df05b1 Mon Sep 17 00:00:00 2001 From: Adrian Mui Date: Thu, 18 Mar 2021 03:58:04 -0700 Subject: [PATCH 023/388] Feature/toggle buffering (#3) This PR adds the property disableBuffering: boolean for android. The PR was initally created as a personal fork and referenced in crunchyroll/vilos#1227 also updated RNVLoadControl constructor and method to reflect new ExoPlayer.LoadControl api related ticket: https://jira.tenkasu.net/browse/VEX-3776 --- Video.js | 1 + .../exoplayer/ReactExoplayerView.java | 50 ++++++++++++++++--- .../exoplayer/ReactExoplayerViewManager.java | 6 +++ 3 files changed, 49 insertions(+), 8 deletions(-) diff --git a/Video.js b/Video.js index b492d48b25..f11191504b 100644 --- a/Video.js +++ b/Video.js @@ -470,6 +470,7 @@ Video.propTypes = { ignoreSilentSwitch: PropTypes.oneOf(['ignore', 'obey']), reportBandwidth: PropTypes.bool, disableFocus: PropTypes.bool, + disableBuffering: PropTypes.bool, controls: PropTypes.bool, audioOnly: PropTypes.bool, currentTime: PropTypes.number, diff --git a/android-exoplayer/src/main/java/com/brentvatne/exoplayer/ReactExoplayerView.java b/android-exoplayer/src/main/java/com/brentvatne/exoplayer/ReactExoplayerView.java index d7c33214da..7881c91459 100644 --- a/android-exoplayer/src/main/java/com/brentvatne/exoplayer/ReactExoplayerView.java +++ b/android-exoplayer/src/main/java/com/brentvatne/exoplayer/ReactExoplayerView.java @@ -26,6 +26,7 @@ import com.facebook.react.bridge.WritableArray; import com.facebook.react.bridge.WritableMap; import com.facebook.react.uimanager.ThemedReactContext; +import com.facebook.react.util.RNLog; import com.google.android.exoplayer2.C; import com.google.android.exoplayer2.DefaultLoadControl; import com.google.android.exoplayer2.DefaultRenderersFactory; @@ -70,6 +71,7 @@ import com.google.android.exoplayer2.upstream.DefaultAllocator; import com.google.android.exoplayer2.upstream.DefaultBandwidthMeter; import com.google.android.exoplayer2.upstream.HttpDataSource; +import com.google.android.exoplayer2.util.Assertions; import com.google.android.exoplayer2.util.Util; import java.net.CookieHandler; @@ -148,6 +150,7 @@ class ReactExoplayerView extends FrameLayout implements private Dynamic textTrackValue; private ReadableArray textTracks; private boolean disableFocus; + private boolean disableBuffering; private boolean preventsDisplaySleepDuringVideoPlayback = true; private float mProgressUpdateInterval = 250.0f; private boolean playInBackground = false; @@ -183,7 +186,7 @@ public void handleMessage(Message msg) { } } }; - + public double getPositionInFirstPeriodMsForCurrentWindow(long currentPosition) { Timeline.Window window = new Timeline.Window(); if(!player.getCurrentTimeline().isEmpty()) { @@ -388,6 +391,28 @@ private void reLayout(View view) { view.layout(view.getLeft(), view.getTop(), view.getMeasuredWidth(), view.getMeasuredHeight()); } + private class RNVLoadControl extends DefaultLoadControl { + public RNVLoadControl(DefaultAllocator allocator, int minBufferMs, int maxBufferMs, int bufferForPlaybackMs, int bufferForPlaybackAfterRebufferMs, int targetBufferBytes, boolean prioritizeTimeOverSizeThresholds, int backBufferDurationMs, boolean retainBackBufferFromKeyframe) { + super(allocator, + minBufferMs, + maxBufferMs, + bufferForPlaybackMs, + bufferForPlaybackAfterRebufferMs, + targetBufferBytes, + prioritizeTimeOverSizeThresholds, + backBufferDurationMs, + retainBackBufferFromKeyframe); + } + + @Override + public boolean shouldContinueLoading(long playbackPositionUs, long bufferedDurationUs, float playbackSpeed) { + if (ReactExoplayerView.this.disableBuffering) { + return false; + } + return super.shouldContinueLoading(playbackPositionUs, bufferedDurationUs, playbackSpeed); + } + } + private void initializePlayer() { ReactExoplayerView self = this; // This ensures all props have been settled, to avoid async racing conditions. @@ -401,19 +426,24 @@ public void run() { .setMaxVideoBitrate(maxBitRate == 0 ? Integer.MAX_VALUE : maxBitRate)); DefaultAllocator allocator = new DefaultAllocator(true, C.DEFAULT_BUFFER_SEGMENT_SIZE); - DefaultLoadControl.Builder defaultLoadControlBuilder = new DefaultLoadControl.Builder(); - defaultLoadControlBuilder.setAllocator(allocator); - defaultLoadControlBuilder.setBufferDurationsMs(minBufferMs, maxBufferMs, bufferForPlaybackMs, bufferForPlaybackAfterRebufferMs); - defaultLoadControlBuilder.setTargetBufferBytes(-1); - defaultLoadControlBuilder.setPrioritizeTimeOverSizeThresholds(true); - DefaultLoadControl defaultLoadControl = defaultLoadControlBuilder.createDefaultLoadControl(); + RNVLoadControl loadControl = new RNVLoadControl( + allocator, + minBufferMs, + maxBufferMs, + bufferForPlaybackMs, + bufferForPlaybackAfterRebufferMs, + -1, + true, + DefaultLoadControl.DEFAULT_BACK_BUFFER_DURATION_MS, + DefaultLoadControl.DEFAULT_RETAIN_BACK_BUFFER_FROM_KEYFRAME + ); DefaultRenderersFactory renderersFactory = new DefaultRenderersFactory(getContext()) .setExtensionRendererMode(DefaultRenderersFactory.EXTENSION_RENDERER_MODE_OFF); player = new SimpleExoPlayer.Builder(getContext(), renderersFactory) .setTrackSelector​(trackSelector) .setBandwidthMeter(bandwidthMeter) - .setLoadControl(defaultLoadControl) + .setLoadControl(loadControl) .build(); player.addListener(self); player.addMetadataOutput(self); @@ -1282,6 +1312,10 @@ public void setDisableFocus(boolean disableFocus) { this.disableFocus = disableFocus; } + public void setDisableBuffering(boolean disableBuffering) { + this.disableBuffering = disableBuffering; + } + public void setFullscreen(boolean fullscreen) { if (fullscreen == isFullscreen) { return; // Avoid generating events when nothing is changing diff --git a/android-exoplayer/src/main/java/com/brentvatne/exoplayer/ReactExoplayerViewManager.java b/android-exoplayer/src/main/java/com/brentvatne/exoplayer/ReactExoplayerViewManager.java index 0d81e0b202..2fc12e42a7 100644 --- a/android-exoplayer/src/main/java/com/brentvatne/exoplayer/ReactExoplayerViewManager.java +++ b/android-exoplayer/src/main/java/com/brentvatne/exoplayer/ReactExoplayerViewManager.java @@ -63,6 +63,7 @@ public class ReactExoplayerViewManager extends ViewGroupManager Date: Fri, 7 May 2021 11:37:57 +0300 Subject: [PATCH 024/388] VEX-4556: The app crashes when the premium episode is loaded (#4) Fix player crashing when it is being cleared. --- .../java/com/brentvatne/exoplayer/ExoPlayerView.java | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/android-exoplayer/src/main/java/com/brentvatne/exoplayer/ExoPlayerView.java b/android-exoplayer/src/main/java/com/brentvatne/exoplayer/ExoPlayerView.java index 99446bde5e..61cb0dd611 100644 --- a/android-exoplayer/src/main/java/com/brentvatne/exoplayer/ExoPlayerView.java +++ b/android-exoplayer/src/main/java/com/brentvatne/exoplayer/ExoPlayerView.java @@ -86,6 +86,14 @@ public ExoPlayerView(Context context, AttributeSet attrs, int defStyleAttr) { addViewInLayout(layout, 0, aspectRatioParams); } + private void clearVideoView() { + if (surfaceView instanceof TextureView) { + player.clearVideoTextureView((TextureView) surfaceView); + } else if (surfaceView instanceof SurfaceView) { + player.clearVideoSurfaceView((SurfaceView) surfaceView); + } + } + private void setVideoView() { if (surfaceView instanceof TextureView) { player.setVideoTextureView((TextureView) surfaceView); @@ -125,10 +133,10 @@ public void setPlayer(SimpleExoPlayer player) { return; } if (this.player != null) { - this.player.addTextOutput(null); + this.player.removeTextOutput(componentListener); this.player.removeVideoListener(componentListener); this.player.removeListener(componentListener); - this.player.setVideoSurface(null); + clearVideoView(); } this.player = player; shutterView.setVisibility(VISIBLE); From 80873102a4e739cf6b08343a91c21f760c6deaf5 Mon Sep 17 00:00:00 2001 From: Armands Malejev Date: Mon, 17 May 2021 13:09:09 +0300 Subject: [PATCH 025/388] VEX-4579: Network loss handling (#5) Add support for customizing back buffer duration and handle network errors gracefully to prevent releasing the player when network is lost. --- README.md | 14 ++++++++ .../DefaultReactExoplayerConfig.java | 14 +++++++- .../exoplayer/ReactExoplayerConfig.java | 3 ++ ...ReactExoplayerLoadErrorHandlingPolicy.java | 33 +++++++++++++++++++ .../exoplayer/ReactExoplayerView.java | 13 +++++++- .../exoplayer/ReactExoplayerViewManager.java | 12 +++++++ 6 files changed, 87 insertions(+), 2 deletions(-) create mode 100644 android-exoplayer/src/main/java/com/brentvatne/exoplayer/ReactExoplayerLoadErrorHandlingPolicy.java diff --git a/README.md b/README.md index 1b6a913ec3..fc6681f03f 100644 --- a/README.md +++ b/README.md @@ -276,10 +276,12 @@ var styles = StyleSheet.create({ * [allowsExternalPlayback](#allowsexternalplayback) * [audioOnly](#audioonly) * [automaticallyWaitsToMinimizeStalling](#automaticallyWaitsToMinimizeStalling) +* [backBufferDurationMs](#backBufferDurationMs) * [bufferConfig](#bufferconfig) * [controls](#controls) * [currentPlaybackTime](#currentPlaybackTime) * [disableFocus](#disableFocus) +* [disableDisconnectError](#disableDisconnectError) * [filter](#filter) * [filterEnabled](#filterEnabled) * [fullscreen](#fullscreen) @@ -367,6 +369,11 @@ A Boolean value that indicates whether the player should automatically delay pla Platforms: iOS +#### backBufferDurationMs +The number of milliseconds of buffer to keep before the current position. This allows rewinding without rebuffering within that duration. + +Platforms: Android ExoPlayer + #### bufferConfig Adjust the buffer settings. This prop takes an object with one or more of the properties listed below. @@ -416,6 +423,13 @@ Determines whether video audio should override background music/audio in Android Platforms: Android Exoplayer +#### disableDisconnectError +Determines if the player needs to throw an error when connection is lost or not +* **false (default)** - Player will throw an error when connection is lost +* **true** - Player will keep trying to buffer when network connect is lost + +Platforms: Android Exoplayer + ### DRM To setup DRM please follow [this guide](./DRM.md) diff --git a/android-exoplayer/src/main/java/com/brentvatne/exoplayer/DefaultReactExoplayerConfig.java b/android-exoplayer/src/main/java/com/brentvatne/exoplayer/DefaultReactExoplayerConfig.java index d68274b7de..3475273c6e 100644 --- a/android-exoplayer/src/main/java/com/brentvatne/exoplayer/DefaultReactExoplayerConfig.java +++ b/android-exoplayer/src/main/java/com/brentvatne/exoplayer/DefaultReactExoplayerConfig.java @@ -9,16 +9,28 @@ public class DefaultReactExoplayerConfig implements ReactExoplayerConfig { private final DefaultBandwidthMeter bandwidthMeter; + private boolean disableDisconnectError = false; public DefaultReactExoplayerConfig(Context context) { this.bandwidthMeter = new DefaultBandwidthMeter.Builder(context).build(); } - @Override public LoadErrorHandlingPolicy buildLoadErrorHandlingPolicy(int minLoadRetryCount) { + if (this.disableDisconnectError) { + // Use custom error handling policy to prevent throwing an error when losing network connection + return new ReactExoplayerLoadErrorHandlingPolicy(minLoadRetryCount); + } return new DefaultLoadErrorHandlingPolicy(minLoadRetryCount); } + public void setDisableDisconnectError(boolean disableDisconnectError) { + this.disableDisconnectError = disableDisconnectError; + } + + public boolean getDisableDisconnectError() { + return this.disableDisconnectError; + } + @Override public DefaultBandwidthMeter getBandwidthMeter() { return bandwidthMeter; diff --git a/android-exoplayer/src/main/java/com/brentvatne/exoplayer/ReactExoplayerConfig.java b/android-exoplayer/src/main/java/com/brentvatne/exoplayer/ReactExoplayerConfig.java index 522578b775..2cc56f9a7c 100644 --- a/android-exoplayer/src/main/java/com/brentvatne/exoplayer/ReactExoplayerConfig.java +++ b/android-exoplayer/src/main/java/com/brentvatne/exoplayer/ReactExoplayerConfig.java @@ -9,5 +9,8 @@ public interface ReactExoplayerConfig { LoadErrorHandlingPolicy buildLoadErrorHandlingPolicy(int minLoadRetryCount); + void setDisableDisconnectError(boolean disableDisconnectError); + boolean getDisableDisconnectError(); + DefaultBandwidthMeter getBandwidthMeter(); } diff --git a/android-exoplayer/src/main/java/com/brentvatne/exoplayer/ReactExoplayerLoadErrorHandlingPolicy.java b/android-exoplayer/src/main/java/com/brentvatne/exoplayer/ReactExoplayerLoadErrorHandlingPolicy.java new file mode 100644 index 0000000000..c701310fcc --- /dev/null +++ b/android-exoplayer/src/main/java/com/brentvatne/exoplayer/ReactExoplayerLoadErrorHandlingPolicy.java @@ -0,0 +1,33 @@ +package com.brentvatne.exoplayer; + +import java.io.IOException; +import com.google.android.exoplayer2.upstream.DefaultLoadErrorHandlingPolicy; +import com.google.android.exoplayer2.upstream.HttpDataSource.HttpDataSourceException; +import com.google.android.exoplayer2.upstream.LoadErrorHandlingPolicy.LoadErrorInfo; +import com.google.android.exoplayer2.C; + +public final class ReactExoplayerLoadErrorHandlingPolicy extends DefaultLoadErrorHandlingPolicy { + private int minLoadRetryCount = Integer.MAX_VALUE; + + public ReactExoplayerLoadErrorHandlingPolicy(int minLoadRetryCount) { + super(minLoadRetryCount); + this.minLoadRetryCount = minLoadRetryCount; + } + + @Override + public long getRetryDelayMsFor(LoadErrorInfo loadErrorInfo) { + if (loadErrorInfo.exception instanceof HttpDataSourceException) { + // Capture the error we get when there is no network connectivity and keep retrying it + return 1000; // Retry every second + } else if(loadErrorInfo.errorCount < this.minLoadRetryCount) { + return Math.min((loadErrorInfo.errorCount - 1) * 1000, 5000); // Default timeout handling + } else { + return C.TIME_UNSET; // Done retrying and will return the error immediately + } + } + + @Override + public int getMinimumLoadableRetryCount(int dataType) { + return Integer.MAX_VALUE; + } +} \ No newline at end of file diff --git a/android-exoplayer/src/main/java/com/brentvatne/exoplayer/ReactExoplayerView.java b/android-exoplayer/src/main/java/com/brentvatne/exoplayer/ReactExoplayerView.java index 7881c91459..488f2d3be7 100644 --- a/android-exoplayer/src/main/java/com/brentvatne/exoplayer/ReactExoplayerView.java +++ b/android-exoplayer/src/main/java/com/brentvatne/exoplayer/ReactExoplayerView.java @@ -139,6 +139,7 @@ class ReactExoplayerView extends FrameLayout implements private Handler mainHandler; // Props from React + private int backBufferDurationMs = DefaultLoadControl.DEFAULT_BACK_BUFFER_DURATION_MS; private Uri srcUri; private String extension; private boolean repeat; @@ -151,6 +152,7 @@ class ReactExoplayerView extends FrameLayout implements private ReadableArray textTracks; private boolean disableFocus; private boolean disableBuffering; + private boolean disableDisconnectError; private boolean preventsDisplaySleepDuringVideoPlayback = true; private float mProgressUpdateInterval = 250.0f; private boolean playInBackground = false; @@ -434,7 +436,7 @@ public void run() { bufferForPlaybackAfterRebufferMs, -1, true, - DefaultLoadControl.DEFAULT_BACK_BUFFER_DURATION_MS, + backBufferDurationMs, DefaultLoadControl.DEFAULT_RETAIN_BACK_BUFFER_FROM_KEYFRAME ); DefaultRenderersFactory renderersFactory = @@ -527,6 +529,7 @@ private DrmSessionManager buildDrmSessionManager(UUID uuid, private MediaSource buildMediaSource(Uri uri, String overrideExtension, DrmSessionManager drmSessionManager) { int type = Util.inferContentType(!TextUtils.isEmpty(overrideExtension) ? "." + overrideExtension : uri.getLastPathSegment()); + config.setDisableDisconnectError(this.disableDisconnectError); switch (type) { case C.TYPE_SS: return new SsMediaSource.Factory( @@ -1312,10 +1315,18 @@ public void setDisableFocus(boolean disableFocus) { this.disableFocus = disableFocus; } + public void setBackBufferDurationMs(int backBufferDurationMs) { + this.backBufferDurationMs = backBufferDurationMs; + } + public void setDisableBuffering(boolean disableBuffering) { this.disableBuffering = disableBuffering; } + public void setDisableDisconnectError(boolean disableDisconnectError) { + this.disableDisconnectError = disableDisconnectError; + } + public void setFullscreen(boolean fullscreen) { if (fullscreen == isFullscreen) { return; // Avoid generating events when nothing is changing diff --git a/android-exoplayer/src/main/java/com/brentvatne/exoplayer/ReactExoplayerViewManager.java b/android-exoplayer/src/main/java/com/brentvatne/exoplayer/ReactExoplayerViewManager.java index 2fc12e42a7..c460f17618 100644 --- a/android-exoplayer/src/main/java/com/brentvatne/exoplayer/ReactExoplayerViewManager.java +++ b/android-exoplayer/src/main/java/com/brentvatne/exoplayer/ReactExoplayerViewManager.java @@ -49,6 +49,7 @@ public class ReactExoplayerViewManager extends ViewGroupManager Date: Tue, 18 May 2021 09:20:32 -0600 Subject: [PATCH 026/388] Fix for issue #2153 --- .../java/com/brentvatne/exoplayer/ReactExoplayerView.java | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/android-exoplayer/src/main/java/com/brentvatne/exoplayer/ReactExoplayerView.java b/android-exoplayer/src/main/java/com/brentvatne/exoplayer/ReactExoplayerView.java index b41b2768ff..56be2eb5d1 100644 --- a/android-exoplayer/src/main/java/com/brentvatne/exoplayer/ReactExoplayerView.java +++ b/android-exoplayer/src/main/java/com/brentvatne/exoplayer/ReactExoplayerView.java @@ -1219,13 +1219,11 @@ public void setPausedModifier(boolean paused) { public void setMutedModifier(boolean muted) { this.muted = muted; - audioVolume = muted ? 0.f : 1.f; if (player != null) { - player.setVolume(audioVolume); + player.setVolume(muted ? 0.f : audioVolume); } } - public void setVolumeModifier(float volume) { audioVolume = volume; if (player != null) { From dcea67eb963c24a5876c75621dd15ecef8dc197c Mon Sep 17 00:00:00 2001 From: anderslemke Date: Thu, 3 Jun 2021 15:11:57 +0200 Subject: [PATCH 027/388] Make sure modifiers are applied before playing --- ios/Video/RCTVideo.m | 1 + 1 file changed, 1 insertion(+) diff --git a/ios/Video/RCTVideo.m b/ios/Video/RCTVideo.m index 989167a6c0..8811b65c8e 100644 --- a/ios/Video/RCTVideo.m +++ b/ios/Video/RCTVideo.m @@ -383,6 +383,7 @@ - (void)setSrc:(NSDictionary *)source } self->_player = [AVPlayer playerWithPlayerItem:self->_playerItem]; + [self applyModifiers]; self->_player.actionAtItemEnd = AVPlayerActionAtItemEndNone; [self->_player addObserver:self forKeyPath:playbackRate options:0 context:nil]; From d094886087c046bc79888c47f48833463bf7350a Mon Sep 17 00:00:00 2001 From: Tuan Luong Date: Sun, 13 Jun 2021 12:06:37 +0700 Subject: [PATCH 028/388] keep screen on when in fullscreen mode --- .../brentvatne/exoplayer/ExoPlayerFullscreenVideoActivity.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/android-exoplayer/src/main/java/com/brentvatne/exoplayer/ExoPlayerFullscreenVideoActivity.java b/android-exoplayer/src/main/java/com/brentvatne/exoplayer/ExoPlayerFullscreenVideoActivity.java index d3b8720801..09b2cdfdbf 100644 --- a/android-exoplayer/src/main/java/com/brentvatne/exoplayer/ExoPlayerFullscreenVideoActivity.java +++ b/android-exoplayer/src/main/java/com/brentvatne/exoplayer/ExoPlayerFullscreenVideoActivity.java @@ -4,6 +4,7 @@ import android.os.Bundle; import android.view.KeyEvent; import android.view.View; +import android.view.WindowManager; import android.widget.ImageView; import androidx.appcompat.app.AppCompatActivity; @@ -24,6 +25,8 @@ public class ExoPlayerFullscreenVideoActivity extends AppCompatActivity implemen @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); + getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); + id = getIntent().getIntExtra(EXTRA_ID, -1); String orientation = getIntent().getStringExtra(EXTRA_ORIENTATION); if ("landscape".equals(orientation)) { From f6e70de15fd9e474ff1570f2bba460fe3db77d93 Mon Sep 17 00:00:00 2001 From: Olgun Kaya Date: Fri, 18 Jun 2021 13:51:47 +0300 Subject: [PATCH 029/388] little positional tweak to make it look more composed on gradle build file --- android-exoplayer/build.gradle | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/android-exoplayer/build.gradle b/android-exoplayer/build.gradle index 55356e0a08..9c78939454 100644 --- a/android-exoplayer/build.gradle +++ b/android-exoplayer/build.gradle @@ -31,7 +31,6 @@ dependencies { implementation('com.google.android.exoplayer:exoplayer:2.11.4') { exclude group: 'com.android.support' } - implementation 'com.google.android.exoplayer:extension-ima:2.11.4' // All support libs must use the same version implementation "androidx.annotation:annotation:1.1.0" @@ -41,6 +40,8 @@ dependencies { implementation('com.google.android.exoplayer:extension-okhttp:2.11.4') { exclude group: 'com.squareup.okhttp3', module: 'okhttp' } + implementation 'com.google.android.exoplayer:extension-ima:2.11.4' + implementation 'com.squareup.okhttp3:okhttp:${OKHTTP_VERSION}' } From 3fed079b34e2c11d3833ad2312bd2da104fd33e8 Mon Sep 17 00:00:00 2001 From: Olgun Kaya Date: Fri, 18 Jun 2021 13:52:03 +0300 Subject: [PATCH 030/388] no message --- android-exoplayer/build.gradle | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/android-exoplayer/build.gradle b/android-exoplayer/build.gradle index 9c78939454..3ddfd54a59 100644 --- a/android-exoplayer/build.gradle +++ b/android-exoplayer/build.gradle @@ -40,8 +40,8 @@ dependencies { implementation('com.google.android.exoplayer:extension-okhttp:2.11.4') { exclude group: 'com.squareup.okhttp3', module: 'okhttp' } - implementation 'com.google.android.exoplayer:extension-ima:2.11.4' - + implementation 'com.google.android.exoplayer:extension-ima:2.11.4' + implementation 'com.squareup.okhttp3:okhttp:${OKHTTP_VERSION}' } From 7263b8ecc03a3edc907a7001e26330955a150cec Mon Sep 17 00:00:00 2001 From: Olgun Kaya Date: Fri, 18 Jun 2021 13:52:44 +0300 Subject: [PATCH 031/388] pre test version --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 8f113f3a5a..7071c52ae8 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "react-native-video-inc-ads", - "version": "5.1.1", + "version": "0.0.1", "description": "A