Commit 4362e596 authored by Baris Sencan's avatar Baris Sencan
Browse files

[Android] src, repeat, paused properties fully working

parent 17467799
Loading
Loading
Loading
Loading
+7 −8
Changes for Video.js: 7 added lines, 8 removed lines.
Original line number Diff line number Diff line
@@ -4,7 +4,6 @@ const {
  StyleSheet,
  requireNativeComponent,
  PropTypes,
  NativeModules,
} = React;

const VideoResizeMode = require('./VideoResizeMode');
@@ -50,16 +49,16 @@ class Video extends Component {

    let nativeResizeMode;
    if (resizeMode === VideoResizeMode.stretch) {
      nativeResizeMode = NativeModules.VideoManager.ScaleToFill;
      nativeResizeMode = RCTVideo.ScaleToFill;
    } else if (resizeMode === VideoResizeMode.contain) {
      nativeResizeMode = NativeModules.VideoManager.ScaleAspectFit;
      nativeResizeMode = RCTVideo.ScaleAspectFit;
    } else if (resizeMode === VideoResizeMode.cover) {
      nativeResizeMode = NativeModules.VideoManager.ScaleAspectFill;
      nativeResizeMode = RCTVideo.ScaleAspectFill;
    } else {
      nativeResizeMode = NativeModules.VideoManager.ScaleNone;
      nativeResizeMode = RCTVideo.ScaleNone;
    }

    let nativeProps = Object.assign({}, this.props);
    const nativeProps = Object.assign({}, this.props);
    Object.assign(nativeProps, {
      style: [styles.base, style],
      resizeMode: nativeResizeMode,
@@ -67,7 +66,7 @@ class Video extends Component {
        uri: uri,
        isNetwork,
        isAsset,
        type: source.type || 'mp4'
        type: source.type || 'mp4',
      },
      seek: seekTime,
      onVideoLoad: this._onLoad,
@@ -135,7 +134,7 @@ Video.propTypes = {
  rotation: React.PropTypes.number,
};

var RCTVideo = requireNativeComponent('RCTVideo', Video, {
const RCTVideo = requireNativeComponent('RCTVideo', Video, {
  nativeOnly: {
    src: true,
    seek: true,
+1 −7
Changes for android/src/main/java/com/brentvatne/react/ReactVideoPackage.java: 1 added line, 7 removed lines.
Original line number Diff line number Diff line
@@ -13,12 +13,6 @@ import java.util.List;

public class ReactVideoPackage implements ReactPackage {

    private Activity mActivity = null;

    public ReactVideoPackage(Activity activity) {
        mActivity = activity;
    }

    @Override
    public List<NativeModule> createNativeModules(ReactApplicationContext reactContext) {
        return Collections.emptyList();
@@ -31,6 +25,6 @@ public class ReactVideoPackage implements ReactPackage {

    @Override
    public List<ViewManager> createViewManagers(ReactApplicationContext reactContext) {
        return Arrays.<ViewManager>asList(new ReactVideoViewManager(mActivity));
        return Arrays.<ViewManager>asList(new ReactVideoViewManager());
    }
}
+141 −10
Changes for android/src/main/java/com/brentvatne/react/ReactVideoViewManager.java: 141 added lines, 10 removed lines.
Original line number Diff line number Diff line
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.support.annotation.Nullable;
import android.widget.FrameLayout;
import android.widget.VideoView;
import com.facebook.react.bridge.ReadableMap;
import com.facebook.react.common.MapBuilder;
import com.facebook.react.uimanager.ReactProp;
import com.facebook.react.uimanager.SimpleViewManager;
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";
    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;

    public ReactVideoViewManager(Activity activity) {
        mActivity = activity;
    private enum ResizeMode {
        SCALE_NONE, SCALE_TO_FILL, SCALE_ASPECT_FIT, SCALE_ASPECT_FILL
    }

    private boolean mRepeat = false;
    private boolean mPaused = false;

    @Override
    public String getName() {
        return REACT_CLASS;
    }

    @Override
    protected VideoView createViewInstance(ThemedReactContext themedReactContext) {
        return new VideoView(themedReactContext);
    protected FrameLayout createViewInstance(ThemedReactContext 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)
    public void setSrc(VideoView videoView, @Nullable ReadableMap src) {
        videoView.setVideoURI(Uri.parse(src.getString("uri")));
    public void setSrc(final FrameLayout container, @Nullable ReadableMap src) {
        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);
    }
}