Commit 38d22529 authored by RWOverdijk's avatar RWOverdijk
Browse files

add support for onTimedMetaData for android

parent b303f991
Loading
Loading
Loading
Loading
+46 −2
Changes for android/src/main/java/com/brentvatne/react/ReactVideoView.java: 46 added lines, 2 removed lines.
Original line number Diff line number Diff line
@@ -4,6 +4,7 @@ import android.annotation.SuppressLint;
import android.content.res.AssetFileDescriptor;
import android.graphics.Matrix;
import android.media.MediaPlayer;
import android.media.TimedMetaData;
import android.net.Uri;
import android.os.Handler;
import android.util.Log;
@@ -16,6 +17,8 @@ import com.android.vending.expansion.zipfile.ZipResourceFile;
import com.facebook.react.bridge.Arguments;
import com.facebook.react.bridge.LifecycleEventListener;
import com.facebook.react.bridge.WritableMap;
import com.facebook.react.bridge.WritableArray;
import com.facebook.react.bridge.WritableNativeArray;
import com.facebook.react.uimanager.ThemedReactContext;
import com.facebook.react.uimanager.events.RCTEventEmitter;
import com.yqritc.scalablevideoview.ScalableType;
@@ -24,19 +27,28 @@ import com.yqritc.scalablevideoview.ScaleManager;
import com.yqritc.scalablevideoview.Size;

import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.util.HashMap;
import java.util.Map;
import java.lang.Math;

@SuppressLint("ViewConstructor")
public class ReactVideoView extends ScalableVideoView implements MediaPlayer.OnPreparedListener, MediaPlayer
        .OnErrorListener, MediaPlayer.OnBufferingUpdateListener, MediaPlayer.OnCompletionListener, MediaPlayer.OnInfoListener, LifecycleEventListener, MediaController.MediaPlayerControl {
public class ReactVideoView extends ScalableVideoView implements
    MediaPlayer.OnPreparedListener,
    MediaPlayer.OnErrorListener,
    MediaPlayer.OnBufferingUpdateListener,
    MediaPlayer.OnTimedMetaDataAvailableListener,
    MediaPlayer.OnCompletionListener,
    MediaPlayer.OnInfoListener,
    LifecycleEventListener,
    MediaController.MediaPlayerControl {

    public enum Events {
        EVENT_LOAD_START("onVideoLoadStart"),
        EVENT_LOAD("onVideoLoad"),
        EVENT_ERROR("onVideoError"),
        EVENT_PROGRESS("onVideoProgress"),
        EVENT_TIMED_METADATA("onTimedMetadata"),
        EVENT_SEEK("onVideoSeek"),
        EVENT_END("onVideoEnd"),
        EVENT_STALLED("onPlaybackStalled"),
@@ -70,6 +82,7 @@ public class ReactVideoView extends ScalableVideoView implements MediaPlayer.OnP
    public static final String EVENT_PROP_WIDTH = "width";
    public static final String EVENT_PROP_HEIGHT = "height";
    public static final String EVENT_PROP_ORIENTATION = "orientation";
    public static final String EVENT_PROP_METADATA = "metadata";

    public static final String EVENT_PROP_ERROR = "error";
    public static final String EVENT_PROP_WHAT = "what";
@@ -181,6 +194,7 @@ public class ReactVideoView extends ScalableVideoView implements MediaPlayer.OnP
            mMediaPlayer.setOnPreparedListener(this);
            mMediaPlayer.setOnBufferingUpdateListener(this);
            mMediaPlayer.setOnCompletionListener(this);
            mMediaPlayer.setOnTimedMetaDataAvailableListener(this);
            mMediaPlayer.setOnInfoListener(this);
        }
    }
@@ -444,6 +458,9 @@ public class ReactVideoView extends ScalableVideoView implements MediaPlayer.OnP
                }
            });
        }

        // Select track (so we can use it to listen to timed meta data updates)
        mp.selectTrack(0);
    }

    @Override
@@ -478,6 +495,9 @@ public class ReactVideoView extends ScalableVideoView implements MediaPlayer.OnP

    @Override
    public void onBufferingUpdate(MediaPlayer mp, int percent) {
        // Select track (so we can use it to listen to timed meta data updates)
        mp.selectTrack(0);

        mVideoBufferedDuration = (int) Math.round((double) (mVideoDuration * percent) / 100.0);
    }

@@ -529,6 +549,30 @@ public class ReactVideoView extends ScalableVideoView implements MediaPlayer.OnP
        mEventEmitter.receiveEvent(getId(), Events.EVENT_END.toString(), null);
    }

    @Override
    public void onTimedMetaDataAvailable(MediaPlayer mp, TimedMetaData data) {
        WritableMap event = Arguments.createMap();

        try {
            String rawMeta  = new String(data.getMetaData(), "UTF-8");
            WritableMap id3 = Arguments.createMap();

            id3.putString("value", rawMeta.substring(rawMeta.lastIndexOf("\u0003") + 1));
            id3.putString("identifier", "id3/TDEN");

            WritableArray metadata = new WritableNativeArray();

            metadata.pushMap(id3);

            event.putArray(EVENT_PROP_METADATA, metadata);
            event.putDouble("target", getId());
        } catch(UnsupportedEncodingException e) {
            e.printStackTrace();
        }

        mEventEmitter.receiveEvent(getId(), Events.EVENT_TIMED_METADATA.toString(), event);
    }

    @Override
    protected void onDetachedFromWindow() {