[Android] src, repeat, paused properties fully working
This commit is contained in:
parent
1746779909
commit
4362e596a8
15
Video.js
15
Video.js
@ -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,
|
||||||
|
@ -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());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user