Loading Video.js +24 −0 Changes for Video.js: 24 added lines, 0 removed lines. Original line number Diff line number Diff line Loading @@ -27,6 +27,29 @@ export default class Video extends Component { this._root.setNativeProps(nativeProps); } toTypeString(x) { switch (typeof x) { case "object": return x instanceof Date ? x.toISOString() : JSON.stringify(x); // object, null case "undefined": return ""; default: // boolean, number, string return x.toString(); } } stringsOnlyObject(obj) { const strObj = {}; Object.keys(obj).forEach(x => { strObj[x] = this.toTypeString(obj[x]); }); return strObj; } seek = (time, tolerance = 100) => { if (Platform.OS === 'ios') { this.setNativeProps({ Loading Loading @@ -202,6 +225,7 @@ export default class Video extends Component { type: source.type || '', mainVer: source.mainVer || 0, patchVer: source.patchVer || 0, requestHeaders: source.headers ? this.stringsOnlyObject(source.headers) : {} }, onVideoLoadStart: this._onLoadStart, onVideoLoad: this._onLoad, Loading android-exoplayer/src/main/java/com/brentvatne/exoplayer/DataSourceUtil.java +15 −8 Changes for android-exoplayer/src/main/java/com/brentvatne/exoplayer/DataSourceUtil.java: 15 added lines, 8 removed lines. Original line number Diff line number Diff line Loading @@ -17,6 +17,8 @@ import com.google.android.exoplayer2.util.Util; import okhttp3.Cookie; import okhttp3.JavaNetCookieJar; import okhttp3.OkHttpClient; import java.util.Map; public class DataSourceUtil { Loading Loading @@ -49,9 +51,10 @@ public class DataSourceUtil { DataSourceUtil.rawDataSourceFactory = factory; } public static DataSource.Factory getDefaultDataSourceFactory(ReactContext context, DefaultBandwidthMeter bandwidthMeter) { if (defaultDataSourceFactory == null) { defaultDataSourceFactory = buildDataSourceFactory(context, bandwidthMeter); public static DataSource.Factory getDefaultDataSourceFactory(ReactContext context, DefaultBandwidthMeter bandwidthMeter, Map<String, String> requestHeaders) { if (defaultDataSourceFactory == null || (requestHeaders != null && !requestHeaders.isEmpty())) { defaultDataSourceFactory = buildDataSourceFactory(context, bandwidthMeter, requestHeaders); } return defaultDataSourceFactory; } Loading @@ -64,17 +67,21 @@ public class DataSourceUtil { return new RawResourceDataSourceFactory(context.getApplicationContext()); } private static DataSource.Factory buildDataSourceFactory(ReactContext context, DefaultBandwidthMeter bandwidthMeter) { private static DataSource.Factory buildDataSourceFactory(ReactContext context, DefaultBandwidthMeter bandwidthMeter, Map<String, String> requestHeaders) { return new DefaultDataSourceFactory(context, bandwidthMeter, buildHttpDataSourceFactory(context, bandwidthMeter)); buildHttpDataSourceFactory(context, bandwidthMeter, requestHeaders)); } private static HttpDataSource.Factory buildHttpDataSourceFactory(ReactContext context, DefaultBandwidthMeter bandwidthMeter) { private static HttpDataSource.Factory buildHttpDataSourceFactory(ReactContext context, DefaultBandwidthMeter bandwidthMeter, Map<String, String> requestHeaders) { OkHttpClient client = OkHttpClientProvider.getOkHttpClient(); CookieJarContainer container = (CookieJarContainer) client.cookieJar(); ForwardingCookieHandler handler = new ForwardingCookieHandler(context); container.setCookieJar(new JavaNetCookieJar(handler)); return new OkHttpDataSourceFactory(client, getUserAgent(context), bandwidthMeter); } OkHttpDataSourceFactory okHttpDataSourceFactory = new OkHttpDataSourceFactory(client, getUserAgent(context), bandwidthMeter); if (requestHeaders != null) okHttpDataSourceFactory.getDefaultRequestProperties().set(requestHeaders); return okHttpDataSourceFactory; } } android-exoplayer/src/main/java/com/brentvatne/exoplayer/ReactExoplayerView.java +6 −3 Changes for android-exoplayer/src/main/java/com/brentvatne/exoplayer/ReactExoplayerView.java: 6 added lines, 3 removed lines. Original line number Diff line number Diff line Loading @@ -65,6 +65,7 @@ import java.net.CookieHandler; import java.net.CookieManager; import java.net.CookiePolicy; import java.lang.Math; import java.util.Map; import java.lang.Object; import java.util.ArrayList; Loading Loading @@ -117,6 +118,7 @@ class ReactExoplayerView extends FrameLayout implements private float mProgressUpdateInterval = 250.0f; private boolean playInBackground = false; private boolean useTextureView = false; private Map<String, String> requestHeaders; // \ End props // React Loading Loading @@ -416,7 +418,7 @@ class ReactExoplayerView extends FrameLayout implements * @return A new DataSource factory. */ private DataSource.Factory buildDataSourceFactory(boolean useBandwidthMeter) { return DataSourceUtil.getDefaultDataSourceFactory(this.themedReactContext, useBandwidthMeter ? BANDWIDTH_METER : null); return DataSourceUtil.getDefaultDataSourceFactory(this.themedReactContext, useBandwidthMeter ? BANDWIDTH_METER : null, requestHeaders); } // AudioManager.OnAudioFocusChangeListener implementation Loading Loading @@ -660,14 +662,15 @@ class ReactExoplayerView extends FrameLayout implements // ReactExoplayerViewManager public api public void setSrc(final Uri uri, final String extension) { public void setSrc(final Uri uri, final String extension, Map<String, String> headers) { if (uri != null) { boolean isOriginalSourceNull = srcUri == null; boolean isSourceEqual = uri.equals(srcUri); this.srcUri = uri; this.extension = extension; this.mediaDataSourceFactory = DataSourceUtil.getDefaultDataSourceFactory(this.themedReactContext, BANDWIDTH_METER); this.requestHeaders = headers; this.mediaDataSourceFactory = DataSourceUtil.getDefaultDataSourceFactory(this.themedReactContext, BANDWIDTH_METER, this.requestHeaders); if (!isOriginalSourceNull && !isSourceEqual) { reloadSource(); Loading android-exoplayer/src/main/java/com/brentvatne/exoplayer/ReactExoplayerViewManager.java +29 −1 Changes for android-exoplayer/src/main/java/com/brentvatne/exoplayer/ReactExoplayerViewManager.java: 29 added lines, 1 removed line. Original line number Diff line number Diff line Loading @@ -13,6 +13,7 @@ import com.facebook.react.uimanager.ViewGroupManager; import com.facebook.react.uimanager.annotations.ReactProp; import com.google.android.exoplayer2.upstream.RawResourceDataSource; import java.util.HashMap; import java.util.Map; import javax.annotation.Nullable; Loading @@ -24,6 +25,7 @@ public class ReactExoplayerViewManager extends ViewGroupManager<ReactExoplayerVi private static final String PROP_SRC = "src"; private static final String PROP_SRC_URI = "uri"; private static final String PROP_SRC_TYPE = "type"; private static final String PROP_SRC_HEADERS = "requestHeaders"; private static final String PROP_RESIZE_MODE = "resizeMode"; private static final String PROP_REPEAT = "repeat"; private static final String PROP_SELECTED_TEXT_TRACK = "selectedTextTrack"; Loading Loading @@ -80,6 +82,8 @@ public class ReactExoplayerViewManager extends ViewGroupManager<ReactExoplayerVi Context context = videoView.getContext().getApplicationContext(); String uriString = src.hasKey(PROP_SRC_URI) ? src.getString(PROP_SRC_URI) : null; String extension = src.hasKey(PROP_SRC_TYPE) ? src.getString(PROP_SRC_TYPE) : null; Map<String, String> headers = src.hasKey(PROP_SRC_HEADERS) ? toStringMap(src.getMap(PROP_SRC_HEADERS)) : null; if (TextUtils.isEmpty(uriString)) { return; Loading @@ -89,7 +93,7 @@ public class ReactExoplayerViewManager extends ViewGroupManager<ReactExoplayerVi Uri srcUri = Uri.parse(uriString); if (srcUri != null) { videoView.setSrc(srcUri, extension); videoView.setSrc(srcUri, extension, headers); } } else { int identifier = context.getResources().getIdentifier( Loading Loading @@ -208,4 +212,28 @@ public class ReactExoplayerViewManager extends ViewGroupManager<ReactExoplayerVi } return ResizeMode.RESIZE_MODE_FIT; } /** * toStringMap converts a {@link ReadableMap} into a HashMap. * * @param readableMap The ReadableMap to be conveted. * @return A HashMap containing the data that was in the ReadableMap. * @see 'Adapted from https://github.com/artemyarulin/react-native-eval/blob/master/android/src/main/java/com/evaluator/react/ConversionUtil.java' */ public static Map<String, String> toStringMap(@Nullable ReadableMap readableMap) { if (readableMap == null) return null; com.facebook.react.bridge.ReadableMapKeySetIterator iterator = readableMap.keySetIterator(); if (!iterator.hasNextKey()) return null; Map<String, String> result = new HashMap<>(); while (iterator.hasNextKey()) { String key = iterator.nextKey(); result.put(key, readableMap.getString(key)); } return result; } } android/src/main/java/com/brentvatne/react/ReactVideoView.java +45 −6 Changes for android/src/main/java/com/brentvatne/react/ReactVideoView.java: 45 added lines, 6 removed lines. Original line number Diff line number Diff line Loading @@ -16,6 +16,7 @@ import com.android.vending.expansion.zipfile.APKExpansionSupport; import com.android.vending.expansion.zipfile.ZipResourceFile; import com.facebook.react.bridge.Arguments; import com.facebook.react.bridge.LifecycleEventListener; import com.facebook.react.bridge.ReadableMap; import com.facebook.react.bridge.WritableMap; import com.facebook.react.uimanager.ThemedReactContext; import com.facebook.react.uimanager.events.RCTEventEmitter; Loading @@ -30,6 +31,8 @@ import java.util.Map; import java.lang.Math; import java.math.BigDecimal; import javax.annotation.Nullable; @SuppressLint("ViewConstructor") public class ReactVideoView extends ScalableVideoView implements MediaPlayer.OnPreparedListener, MediaPlayer .OnErrorListener, MediaPlayer.OnBufferingUpdateListener, MediaPlayer.OnCompletionListener, MediaPlayer.OnInfoListener, LifecycleEventListener, MediaController.MediaPlayerControl { Loading Loading @@ -89,6 +92,7 @@ public class ReactVideoView extends ScalableVideoView implements MediaPlayer.OnP private String mSrcUriString = null; private String mSrcType = "mp4"; private ReadableMap mRequestHeaders = null; private boolean mSrcIsNetwork = false; private boolean mSrcIsAsset = false; private ScalableType mResizeMode = ScalableType.LEFT_TOP; Loading Loading @@ -206,16 +210,17 @@ public class ReactVideoView extends ScalableVideoView implements MediaPlayer.OnP } } public void setSrc(final String uriString, final String type, final boolean isNetwork, final boolean isAsset) { setSrc(uriString,type,isNetwork,isAsset,0,0); public void setSrc(final String uriString, final String type, final boolean isNetwork, final boolean isAsset, final ReadableMap requestHeaders) { setSrc(uriString, type, isNetwork, isAsset, requestHeaders, 0, 0); } public void setSrc(final String uriString, final String type, final boolean isNetwork, final boolean isAsset, final int expansionMainVersion, final int expansionPatchVersion) { public void setSrc(final String uriString, final String type, final boolean isNetwork, final boolean isAsset, final ReadableMap requestHeaders, final int expansionMainVersion, final int expansionPatchVersion) { mSrcUriString = uriString; mSrcType = type; mSrcIsNetwork = isNetwork; mSrcIsAsset = isAsset; mRequestHeaders = requestHeaders; mMainVer = expansionMainVersion; mPatchVer = expansionPatchVersion; Loading Loading @@ -244,7 +249,15 @@ public class ReactVideoView extends ScalableVideoView implements MediaPlayer.OnP headers.put("Cookie", cookie); } setDataSource(uriString); if (mRequestHeaders != null) { headers.putAll(toStringMap(mRequestHeaders)); } /* According to https://github.com/react-native-community/react-native-video/pull/537 * there is an issue with this where it can cause a IOException. * TODO: diagnose this exception and fix it */ setDataSource(mThemedReactContext, parsedUrl, headers); } else if (isAsset) { if (uriString.startsWith("content://")) { Uri parsedUrl = Uri.parse(uriString); Loading Loading @@ -290,8 +303,13 @@ public class ReactVideoView extends ScalableVideoView implements MediaPlayer.OnP } WritableMap src = Arguments.createMap(); WritableMap wRequestHeaders = Arguments.createMap(); wRequestHeaders.merge(mRequestHeaders); src.putString(ReactVideoViewManager.PROP_SRC_URI, uriString); src.putString(ReactVideoViewManager.PROP_SRC_TYPE, type); src.putMap(ReactVideoViewManager.PROP_SRC_HEADERS, wRequestHeaders); src.putBoolean(ReactVideoViewManager.PROP_SRC_IS_NETWORK, isNetwork); if(mMainVer>0) { src.putInt(ReactVideoViewManager.PROP_SRC_MAINVER, mMainVer); Loading Loading @@ -581,10 +599,10 @@ public class ReactVideoView extends ScalableVideoView implements MediaPlayer.OnP super.onAttachedToWindow(); if(mMainVer>0) { setSrc(mSrcUriString, mSrcType, mSrcIsNetwork,mSrcIsAsset,mMainVer,mPatchVer); setSrc(mSrcUriString, mSrcType, mSrcIsNetwork, mSrcIsAsset, mRequestHeaders, mMainVer, mPatchVer); } else { setSrc(mSrcUriString, mSrcType, mSrcIsNetwork,mSrcIsAsset); setSrc(mSrcUriString, mSrcType, mSrcIsNetwork, mSrcIsAsset, mRequestHeaders); } } Loading Loading @@ -618,4 +636,25 @@ public class ReactVideoView extends ScalableVideoView implements MediaPlayer.OnP @Override public void onHostDestroy() { } /** * toStringMap converts a {@link ReadableMap} into a HashMap. * * @param readableMap The ReadableMap to be conveted. * @return A HashMap containing the data that was in the ReadableMap. * @see 'Adapted from https://github.com/artemyarulin/react-native-eval/blob/master/android/src/main/java/com/evaluator/react/ConversionUtil.java' */ public static Map<String, String> toStringMap(@Nullable ReadableMap readableMap) { Map<String, String> result = new HashMap<>(); if (readableMap == null) return result; com.facebook.react.bridge.ReadableMapKeySetIterator iterator = readableMap.keySetIterator(); while (iterator.hasNextKey()) { String key = iterator.nextKey(); result.put(key, readableMap.getString(key)); } return result; } } Loading
Video.js +24 −0 Changes for Video.js: 24 added lines, 0 removed lines. Original line number Diff line number Diff line Loading @@ -27,6 +27,29 @@ export default class Video extends Component { this._root.setNativeProps(nativeProps); } toTypeString(x) { switch (typeof x) { case "object": return x instanceof Date ? x.toISOString() : JSON.stringify(x); // object, null case "undefined": return ""; default: // boolean, number, string return x.toString(); } } stringsOnlyObject(obj) { const strObj = {}; Object.keys(obj).forEach(x => { strObj[x] = this.toTypeString(obj[x]); }); return strObj; } seek = (time, tolerance = 100) => { if (Platform.OS === 'ios') { this.setNativeProps({ Loading Loading @@ -202,6 +225,7 @@ export default class Video extends Component { type: source.type || '', mainVer: source.mainVer || 0, patchVer: source.patchVer || 0, requestHeaders: source.headers ? this.stringsOnlyObject(source.headers) : {} }, onVideoLoadStart: this._onLoadStart, onVideoLoad: this._onLoad, Loading
android-exoplayer/src/main/java/com/brentvatne/exoplayer/DataSourceUtil.java +15 −8 Changes for android-exoplayer/src/main/java/com/brentvatne/exoplayer/DataSourceUtil.java: 15 added lines, 8 removed lines. Original line number Diff line number Diff line Loading @@ -17,6 +17,8 @@ import com.google.android.exoplayer2.util.Util; import okhttp3.Cookie; import okhttp3.JavaNetCookieJar; import okhttp3.OkHttpClient; import java.util.Map; public class DataSourceUtil { Loading Loading @@ -49,9 +51,10 @@ public class DataSourceUtil { DataSourceUtil.rawDataSourceFactory = factory; } public static DataSource.Factory getDefaultDataSourceFactory(ReactContext context, DefaultBandwidthMeter bandwidthMeter) { if (defaultDataSourceFactory == null) { defaultDataSourceFactory = buildDataSourceFactory(context, bandwidthMeter); public static DataSource.Factory getDefaultDataSourceFactory(ReactContext context, DefaultBandwidthMeter bandwidthMeter, Map<String, String> requestHeaders) { if (defaultDataSourceFactory == null || (requestHeaders != null && !requestHeaders.isEmpty())) { defaultDataSourceFactory = buildDataSourceFactory(context, bandwidthMeter, requestHeaders); } return defaultDataSourceFactory; } Loading @@ -64,17 +67,21 @@ public class DataSourceUtil { return new RawResourceDataSourceFactory(context.getApplicationContext()); } private static DataSource.Factory buildDataSourceFactory(ReactContext context, DefaultBandwidthMeter bandwidthMeter) { private static DataSource.Factory buildDataSourceFactory(ReactContext context, DefaultBandwidthMeter bandwidthMeter, Map<String, String> requestHeaders) { return new DefaultDataSourceFactory(context, bandwidthMeter, buildHttpDataSourceFactory(context, bandwidthMeter)); buildHttpDataSourceFactory(context, bandwidthMeter, requestHeaders)); } private static HttpDataSource.Factory buildHttpDataSourceFactory(ReactContext context, DefaultBandwidthMeter bandwidthMeter) { private static HttpDataSource.Factory buildHttpDataSourceFactory(ReactContext context, DefaultBandwidthMeter bandwidthMeter, Map<String, String> requestHeaders) { OkHttpClient client = OkHttpClientProvider.getOkHttpClient(); CookieJarContainer container = (CookieJarContainer) client.cookieJar(); ForwardingCookieHandler handler = new ForwardingCookieHandler(context); container.setCookieJar(new JavaNetCookieJar(handler)); return new OkHttpDataSourceFactory(client, getUserAgent(context), bandwidthMeter); } OkHttpDataSourceFactory okHttpDataSourceFactory = new OkHttpDataSourceFactory(client, getUserAgent(context), bandwidthMeter); if (requestHeaders != null) okHttpDataSourceFactory.getDefaultRequestProperties().set(requestHeaders); return okHttpDataSourceFactory; } }
android-exoplayer/src/main/java/com/brentvatne/exoplayer/ReactExoplayerView.java +6 −3 Changes for android-exoplayer/src/main/java/com/brentvatne/exoplayer/ReactExoplayerView.java: 6 added lines, 3 removed lines. Original line number Diff line number Diff line Loading @@ -65,6 +65,7 @@ import java.net.CookieHandler; import java.net.CookieManager; import java.net.CookiePolicy; import java.lang.Math; import java.util.Map; import java.lang.Object; import java.util.ArrayList; Loading Loading @@ -117,6 +118,7 @@ class ReactExoplayerView extends FrameLayout implements private float mProgressUpdateInterval = 250.0f; private boolean playInBackground = false; private boolean useTextureView = false; private Map<String, String> requestHeaders; // \ End props // React Loading Loading @@ -416,7 +418,7 @@ class ReactExoplayerView extends FrameLayout implements * @return A new DataSource factory. */ private DataSource.Factory buildDataSourceFactory(boolean useBandwidthMeter) { return DataSourceUtil.getDefaultDataSourceFactory(this.themedReactContext, useBandwidthMeter ? BANDWIDTH_METER : null); return DataSourceUtil.getDefaultDataSourceFactory(this.themedReactContext, useBandwidthMeter ? BANDWIDTH_METER : null, requestHeaders); } // AudioManager.OnAudioFocusChangeListener implementation Loading Loading @@ -660,14 +662,15 @@ class ReactExoplayerView extends FrameLayout implements // ReactExoplayerViewManager public api public void setSrc(final Uri uri, final String extension) { public void setSrc(final Uri uri, final String extension, Map<String, String> headers) { if (uri != null) { boolean isOriginalSourceNull = srcUri == null; boolean isSourceEqual = uri.equals(srcUri); this.srcUri = uri; this.extension = extension; this.mediaDataSourceFactory = DataSourceUtil.getDefaultDataSourceFactory(this.themedReactContext, BANDWIDTH_METER); this.requestHeaders = headers; this.mediaDataSourceFactory = DataSourceUtil.getDefaultDataSourceFactory(this.themedReactContext, BANDWIDTH_METER, this.requestHeaders); if (!isOriginalSourceNull && !isSourceEqual) { reloadSource(); Loading
android-exoplayer/src/main/java/com/brentvatne/exoplayer/ReactExoplayerViewManager.java +29 −1 Changes for android-exoplayer/src/main/java/com/brentvatne/exoplayer/ReactExoplayerViewManager.java: 29 added lines, 1 removed line. Original line number Diff line number Diff line Loading @@ -13,6 +13,7 @@ import com.facebook.react.uimanager.ViewGroupManager; import com.facebook.react.uimanager.annotations.ReactProp; import com.google.android.exoplayer2.upstream.RawResourceDataSource; import java.util.HashMap; import java.util.Map; import javax.annotation.Nullable; Loading @@ -24,6 +25,7 @@ public class ReactExoplayerViewManager extends ViewGroupManager<ReactExoplayerVi private static final String PROP_SRC = "src"; private static final String PROP_SRC_URI = "uri"; private static final String PROP_SRC_TYPE = "type"; private static final String PROP_SRC_HEADERS = "requestHeaders"; private static final String PROP_RESIZE_MODE = "resizeMode"; private static final String PROP_REPEAT = "repeat"; private static final String PROP_SELECTED_TEXT_TRACK = "selectedTextTrack"; Loading Loading @@ -80,6 +82,8 @@ public class ReactExoplayerViewManager extends ViewGroupManager<ReactExoplayerVi Context context = videoView.getContext().getApplicationContext(); String uriString = src.hasKey(PROP_SRC_URI) ? src.getString(PROP_SRC_URI) : null; String extension = src.hasKey(PROP_SRC_TYPE) ? src.getString(PROP_SRC_TYPE) : null; Map<String, String> headers = src.hasKey(PROP_SRC_HEADERS) ? toStringMap(src.getMap(PROP_SRC_HEADERS)) : null; if (TextUtils.isEmpty(uriString)) { return; Loading @@ -89,7 +93,7 @@ public class ReactExoplayerViewManager extends ViewGroupManager<ReactExoplayerVi Uri srcUri = Uri.parse(uriString); if (srcUri != null) { videoView.setSrc(srcUri, extension); videoView.setSrc(srcUri, extension, headers); } } else { int identifier = context.getResources().getIdentifier( Loading Loading @@ -208,4 +212,28 @@ public class ReactExoplayerViewManager extends ViewGroupManager<ReactExoplayerVi } return ResizeMode.RESIZE_MODE_FIT; } /** * toStringMap converts a {@link ReadableMap} into a HashMap. * * @param readableMap The ReadableMap to be conveted. * @return A HashMap containing the data that was in the ReadableMap. * @see 'Adapted from https://github.com/artemyarulin/react-native-eval/blob/master/android/src/main/java/com/evaluator/react/ConversionUtil.java' */ public static Map<String, String> toStringMap(@Nullable ReadableMap readableMap) { if (readableMap == null) return null; com.facebook.react.bridge.ReadableMapKeySetIterator iterator = readableMap.keySetIterator(); if (!iterator.hasNextKey()) return null; Map<String, String> result = new HashMap<>(); while (iterator.hasNextKey()) { String key = iterator.nextKey(); result.put(key, readableMap.getString(key)); } return result; } }
android/src/main/java/com/brentvatne/react/ReactVideoView.java +45 −6 Changes for android/src/main/java/com/brentvatne/react/ReactVideoView.java: 45 added lines, 6 removed lines. Original line number Diff line number Diff line Loading @@ -16,6 +16,7 @@ import com.android.vending.expansion.zipfile.APKExpansionSupport; import com.android.vending.expansion.zipfile.ZipResourceFile; import com.facebook.react.bridge.Arguments; import com.facebook.react.bridge.LifecycleEventListener; import com.facebook.react.bridge.ReadableMap; import com.facebook.react.bridge.WritableMap; import com.facebook.react.uimanager.ThemedReactContext; import com.facebook.react.uimanager.events.RCTEventEmitter; Loading @@ -30,6 +31,8 @@ import java.util.Map; import java.lang.Math; import java.math.BigDecimal; import javax.annotation.Nullable; @SuppressLint("ViewConstructor") public class ReactVideoView extends ScalableVideoView implements MediaPlayer.OnPreparedListener, MediaPlayer .OnErrorListener, MediaPlayer.OnBufferingUpdateListener, MediaPlayer.OnCompletionListener, MediaPlayer.OnInfoListener, LifecycleEventListener, MediaController.MediaPlayerControl { Loading Loading @@ -89,6 +92,7 @@ public class ReactVideoView extends ScalableVideoView implements MediaPlayer.OnP private String mSrcUriString = null; private String mSrcType = "mp4"; private ReadableMap mRequestHeaders = null; private boolean mSrcIsNetwork = false; private boolean mSrcIsAsset = false; private ScalableType mResizeMode = ScalableType.LEFT_TOP; Loading Loading @@ -206,16 +210,17 @@ public class ReactVideoView extends ScalableVideoView implements MediaPlayer.OnP } } public void setSrc(final String uriString, final String type, final boolean isNetwork, final boolean isAsset) { setSrc(uriString,type,isNetwork,isAsset,0,0); public void setSrc(final String uriString, final String type, final boolean isNetwork, final boolean isAsset, final ReadableMap requestHeaders) { setSrc(uriString, type, isNetwork, isAsset, requestHeaders, 0, 0); } public void setSrc(final String uriString, final String type, final boolean isNetwork, final boolean isAsset, final int expansionMainVersion, final int expansionPatchVersion) { public void setSrc(final String uriString, final String type, final boolean isNetwork, final boolean isAsset, final ReadableMap requestHeaders, final int expansionMainVersion, final int expansionPatchVersion) { mSrcUriString = uriString; mSrcType = type; mSrcIsNetwork = isNetwork; mSrcIsAsset = isAsset; mRequestHeaders = requestHeaders; mMainVer = expansionMainVersion; mPatchVer = expansionPatchVersion; Loading Loading @@ -244,7 +249,15 @@ public class ReactVideoView extends ScalableVideoView implements MediaPlayer.OnP headers.put("Cookie", cookie); } setDataSource(uriString); if (mRequestHeaders != null) { headers.putAll(toStringMap(mRequestHeaders)); } /* According to https://github.com/react-native-community/react-native-video/pull/537 * there is an issue with this where it can cause a IOException. * TODO: diagnose this exception and fix it */ setDataSource(mThemedReactContext, parsedUrl, headers); } else if (isAsset) { if (uriString.startsWith("content://")) { Uri parsedUrl = Uri.parse(uriString); Loading Loading @@ -290,8 +303,13 @@ public class ReactVideoView extends ScalableVideoView implements MediaPlayer.OnP } WritableMap src = Arguments.createMap(); WritableMap wRequestHeaders = Arguments.createMap(); wRequestHeaders.merge(mRequestHeaders); src.putString(ReactVideoViewManager.PROP_SRC_URI, uriString); src.putString(ReactVideoViewManager.PROP_SRC_TYPE, type); src.putMap(ReactVideoViewManager.PROP_SRC_HEADERS, wRequestHeaders); src.putBoolean(ReactVideoViewManager.PROP_SRC_IS_NETWORK, isNetwork); if(mMainVer>0) { src.putInt(ReactVideoViewManager.PROP_SRC_MAINVER, mMainVer); Loading Loading @@ -581,10 +599,10 @@ public class ReactVideoView extends ScalableVideoView implements MediaPlayer.OnP super.onAttachedToWindow(); if(mMainVer>0) { setSrc(mSrcUriString, mSrcType, mSrcIsNetwork,mSrcIsAsset,mMainVer,mPatchVer); setSrc(mSrcUriString, mSrcType, mSrcIsNetwork, mSrcIsAsset, mRequestHeaders, mMainVer, mPatchVer); } else { setSrc(mSrcUriString, mSrcType, mSrcIsNetwork,mSrcIsAsset); setSrc(mSrcUriString, mSrcType, mSrcIsNetwork, mSrcIsAsset, mRequestHeaders); } } Loading Loading @@ -618,4 +636,25 @@ public class ReactVideoView extends ScalableVideoView implements MediaPlayer.OnP @Override public void onHostDestroy() { } /** * toStringMap converts a {@link ReadableMap} into a HashMap. * * @param readableMap The ReadableMap to be conveted. * @return A HashMap containing the data that was in the ReadableMap. * @see 'Adapted from https://github.com/artemyarulin/react-native-eval/blob/master/android/src/main/java/com/evaluator/react/ConversionUtil.java' */ public static Map<String, String> toStringMap(@Nullable ReadableMap readableMap) { Map<String, String> result = new HashMap<>(); if (readableMap == null) return result; com.facebook.react.bridge.ReadableMapKeySetIterator iterator = readableMap.keySetIterator(); while (iterator.hasNextKey()) { String key = iterator.nextKey(); result.put(key, readableMap.getString(key)); } return result; } }