[Android] src, repeat, paused properties fully working

This commit is contained in:
Baris Sencan 2015-11-03 20:27:38 -08:00
parent 1746779909
commit 4362e596a8
3 changed files with 149 additions and 25 deletions

View File

@ -4,7 +4,6 @@ const {
StyleSheet, StyleSheet,
requireNativeComponent, requireNativeComponent,
PropTypes, PropTypes,
NativeModules,
} = React; } = React;
const VideoResizeMode = require('./VideoResizeMode'); const VideoResizeMode = require('./VideoResizeMode');
@ -50,16 +49,16 @@ class Video extends Component {
let nativeResizeMode; let nativeResizeMode;
if (resizeMode === VideoResizeMode.stretch) { if (resizeMode === VideoResizeMode.stretch) {
nativeResizeMode = NativeModules.VideoManager.ScaleToFill; nativeResizeMode = RCTVideo.ScaleToFill;
} else if (resizeMode === VideoResizeMode.contain) { } else if (resizeMode === VideoResizeMode.contain) {
nativeResizeMode = NativeModules.VideoManager.ScaleAspectFit; nativeResizeMode = RCTVideo.ScaleAspectFit;
} else if (resizeMode === VideoResizeMode.cover) { } else if (resizeMode === VideoResizeMode.cover) {
nativeResizeMode = NativeModules.VideoManager.ScaleAspectFill; nativeResizeMode = RCTVideo.ScaleAspectFill;
} else { } else {
nativeResizeMode = NativeModules.VideoManager.ScaleNone; nativeResizeMode = RCTVideo.ScaleNone;
} }
let nativeProps = Object.assign({}, this.props); const nativeProps = Object.assign({}, this.props);
Object.assign(nativeProps, { Object.assign(nativeProps, {
style: [styles.base, style], style: [styles.base, style],
resizeMode: nativeResizeMode, resizeMode: nativeResizeMode,
@ -67,7 +66,7 @@ class Video extends Component {
uri: uri, uri: uri,
isNetwork, isNetwork,
isAsset, isAsset,
type: source.type || 'mp4' type: source.type || 'mp4',
}, },
seek: seekTime, seek: seekTime,
onVideoLoad: this._onLoad, onVideoLoad: this._onLoad,
@ -135,7 +134,7 @@ Video.propTypes = {
rotation: React.PropTypes.number, rotation: React.PropTypes.number,
}; };
var RCTVideo = requireNativeComponent('RCTVideo', Video, { const RCTVideo = requireNativeComponent('RCTVideo', Video, {
nativeOnly: { nativeOnly: {
src: true, src: true,
seek: true, seek: true,

View File

@ -13,12 +13,6 @@ import java.util.List;
public class ReactVideoPackage implements ReactPackage { public class ReactVideoPackage implements ReactPackage {
private Activity mActivity = null;
public ReactVideoPackage(Activity activity) {
mActivity = activity;
}
@Override @Override
public List<NativeModule> createNativeModules(ReactApplicationContext reactContext) { public List<NativeModule> createNativeModules(ReactApplicationContext reactContext) {
return Collections.emptyList(); return Collections.emptyList();
@ -31,6 +25,6 @@ public class ReactVideoPackage implements ReactPackage {
@Override @Override
public List<ViewManager> createViewManagers(ReactApplicationContext reactContext) { public List<ViewManager> createViewManagers(ReactApplicationContext reactContext) {
return Arrays.<ViewManager>asList(new ReactVideoViewManager(mActivity)); return Arrays.<ViewManager>asList(new ReactVideoViewManager());
} }
} }

View File

@ -1,37 +1,168 @@
package com.brentvatne.react; package com.brentvatne.react;
import android.app.Activity; import android.graphics.Color;
import android.media.MediaPlayer;
import android.widget.MediaController;
import android.net.Uri; import android.net.Uri;
import android.support.annotation.Nullable; import android.support.annotation.Nullable;
import android.widget.FrameLayout;
import android.widget.VideoView; import android.widget.VideoView;
import com.facebook.react.bridge.ReadableMap; import com.facebook.react.bridge.ReadableMap;
import com.facebook.react.common.MapBuilder;
import com.facebook.react.uimanager.ReactProp; import com.facebook.react.uimanager.ReactProp;
import com.facebook.react.uimanager.SimpleViewManager; import com.facebook.react.uimanager.SimpleViewManager;
import com.facebook.react.uimanager.ThemedReactContext; import com.facebook.react.uimanager.ThemedReactContext;
public class ReactVideoViewManager extends SimpleViewManager<VideoView> { import java.util.Map;
import static junit.framework.Assert.assertTrue;
public class ReactVideoViewManager extends SimpleViewManager<FrameLayout> {
public static final String REACT_CLASS = "RCTVideo"; public static final String REACT_CLASS = "RCTVideo";
private static final String PROP_SRC = "src"; private static final String PROP_SRC = "src";
private static final String PROP_RESIZE_MODE = "resizeMode";
private static final String PROP_REPEAT = "repeat";
private static final String PROP_PAUSED = "paused";
private Activity mActivity = null; private enum ResizeMode {
SCALE_NONE, SCALE_TO_FILL, SCALE_ASPECT_FIT, SCALE_ASPECT_FILL
public ReactVideoViewManager(Activity activity) {
mActivity = activity;
} }
private boolean mRepeat = false;
private boolean mPaused = false;
@Override @Override
public String getName() { public String getName() {
return REACT_CLASS; return REACT_CLASS;
} }
@Override @Override
protected VideoView createViewInstance(ThemedReactContext themedReactContext) { protected FrameLayout createViewInstance(ThemedReactContext themedReactContext) {
return new VideoView(themedReactContext); final FrameLayout container = new FrameLayout(themedReactContext);
final VideoView videoView = new VideoView(themedReactContext);
MediaController mediaController = new MediaController(themedReactContext);
mediaController.setAnchorView(videoView);
mediaController.setVisibility(VideoView.GONE);
videoView.setMediaController(mediaController);
videoView.setLayoutParams(new FrameLayout.LayoutParams(
FrameLayout.LayoutParams.MATCH_PARENT,
FrameLayout.LayoutParams.MATCH_PARENT));
container.addView(videoView);
return container;
}
@Override
public
@Nullable
Map getExportedViewConstants() {
return MapBuilder.of(
"ScaleNone", ResizeMode.SCALE_NONE.ordinal(),
"ScaleToFill", ResizeMode.SCALE_TO_FILL.ordinal(),
"ScaleAspectFit", ResizeMode.SCALE_ASPECT_FIT.ordinal(),
"ScaleAspectFill", ResizeMode.SCALE_ASPECT_FILL.ordinal());
} }
@ReactProp(name = PROP_SRC) @ReactProp(name = PROP_SRC)
public void setSrc(VideoView videoView, @Nullable ReadableMap src) { public void setSrc(final FrameLayout container, @Nullable ReadableMap src) {
videoView.setVideoURI(Uri.parse(src.getString("uri"))); final VideoView videoView = (VideoView) container.getChildAt(0);
try {
final String uriString = src.getString("uri");
final boolean isNetwork = src.getBoolean("isNetwork");
videoView.stopPlayback();
if (isNetwork) {
videoView.setVideoPath(uriString);
videoView.setOnPreparedListener(new MediaPlayer.OnPreparedListener() {
@Override
public void onPrepared(MediaPlayer mp) {
applyModifiers(container);
}
});
} else {
videoView.setVideoURI(Uri.parse("android.resource://" + videoView.getContext().getPackageName() +
"/raw/" + uriString));
applyModifiers(container);
}
} catch (Exception e) {
assertTrue("failed to set video source", false);
}
}
@ReactProp(name = PROP_RESIZE_MODE)
public void setResizeMode(final FrameLayout container, int resizeModeOrdinal) {
final VideoView videoView = (VideoView) container.getChildAt(0);
try {
final ResizeMode resizeMode = ResizeMode.values()[resizeModeOrdinal];
FrameLayout.LayoutParams layoutParams = null;
switch (resizeMode) {
case SCALE_NONE:
layoutParams = new FrameLayout.LayoutParams(
FrameLayout.LayoutParams.WRAP_CONTENT,
FrameLayout.LayoutParams.WRAP_CONTENT);
break;
case SCALE_TO_FILL:
layoutParams = new FrameLayout.LayoutParams(
FrameLayout.LayoutParams.MATCH_PARENT,
FrameLayout.LayoutParams.MATCH_PARENT);
break;
case SCALE_ASPECT_FIT:
break;
case SCALE_ASPECT_FILL:
break;
}
if (layoutParams != null) {
videoView.setLayoutParams(layoutParams);
container.updateViewLayout(videoView, layoutParams);
}
} catch (Exception e) {
assertTrue("failed to set video resize mode", false);
}
}
@ReactProp(name = PROP_REPEAT)
public void setRepeat(final FrameLayout container, final boolean repeat) {
mRepeat = repeat;
if (!mRepeat) { return; }
final VideoView videoView = (VideoView) container.getChildAt(0);
videoView.setOnCompletionListener(new MediaPlayer.OnCompletionListener() {
@Override
public void onCompletion(MediaPlayer mp) {
if (mRepeat) {
mp.seekTo(0);
setPaused(container, mPaused);
}
}
});
}
@ReactProp(name = PROP_PAUSED)
public void setPaused(final FrameLayout container, final boolean paused) {
final VideoView videoView = (VideoView) container.getChildAt(0);
videoView.requestFocus();
if (!paused) {
videoView.start();
} else {
videoView.pause();
}
mPaused = paused;
}
private void applyModifiers(final FrameLayout container) {
setRepeat(container, mRepeat);
setPaused(container, mPaused);
} }
} }