package com.anren.omplayer;

import android.content.Context;
import android.graphics.Matrix;
import android.media.AudioManager;
import android.media.MediaPlayer;
import android.net.Uri;
import android.os.Handler;
import android.os.Message;
import android.util.Log;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewGroup;
import android.webkit.CookieManager;
import android.widget.ImageView;
import android.widget.RelativeLayout;
import android.widget.SeekBar;
import android.widget.TextView;

import com.facebook.react.bridge.Arguments;
import com.facebook.react.bridge.LifecycleEventListener;
import com.facebook.react.bridge.WritableMap;
import com.facebook.react.uimanager.ThemedReactContext;
import com.facebook.react.uimanager.events.RCTEventEmitter;
import com.yqritc.scalablevideoview.ScalableType;
import com.yqritc.scalablevideoview.ScaleManager;
import com.yqritc.scalablevideoview.Size;

import java.util.HashMap;
import java.util.Map;
import java.util.Timer;
import java.util.TimerTask;

/**
 * Created by lcg on 2017/6/23.
 */

public class OMVideoPlayer extends RelativeLayout implements MediaPlayer.OnPreparedListener,
        MediaPlayer.OnErrorListener, MediaPlayer.OnBufferingUpdateListener, MediaPlayer.OnCompletionListener,
        MediaPlayer.OnInfoListener, LifecycleEventListener {
    public enum Events {
        EVENT_LOAD_START("onOMVideoLoadStart"),
        EVENT_LOAD("onOMVideoLoad"),
        EVENT_LOAD_STALLED("onOMVideoLoadStalled"),
        EVENT_LOAD_RESUME("onOMVideoLoadResume"),
        EVENT_ERROR("onOMVideoError"),
        EVENT_PROGRESS("onOMVideoProgress"),
        EVENT_SEEK("onOMVideoSeek"),
        EVENT_END("onOMVideoEnd"),
        EVENT_STALLED("onOMPlaybackStalled"),
        EVENT_RESUME("onOMPlaybackResume"),
        EVENT_READY_FOR_DISPLAY("onOMReadyForDisplay"),
        EVENT_FULLSCREEN_WILL_PRESENT("onOMVideoFullscreenPlayerWillPresent"),
        EVENT_FULLSCREEN_DID_PRESENT("onOMVideoFullscreenPlayerDidPresent"),
        EVENT_FULLSCREEN_WILL_DISMISS("onOMVideoFullscreenPlayerWillDismiss"),
        EVENT_FULLSCREEN_DID_DISMISS("onOMVideoFullscreenPlayerDidDismiss");

        private final String mName;

        Events(final String name) {
            mName = name;
        }

        @Override
        public String toString() {
            return mName;
        }
    }

    public static final int MSG_HIDETOOLBAR = 1;

    public static final String EVENT_PROP_FAST_FORWARD = "canPlayFastForward";
    public static final String EVENT_PROP_SLOW_FORWARD = "canPlaySlowForward";
    public static final String EVENT_PROP_SLOW_REVERSE = "canPlaySlowReverse";
    public static final String EVENT_PROP_REVERSE = "canPlayReverse";
    public static final String EVENT_PROP_STEP_FORWARD = "canStepForward";
    public static final String EVENT_PROP_STEP_BACKWARD = "canStepBackward";

    public static final String EVENT_PROP_DURATION = "duration";
    public static final String EVENT_PROP_PLAYABLE_DURATION = "playableDuration";
    public static final String EVENT_PROP_CURRENT_TIME = "currentTime";
    public static final String EVENT_PROP_SEEK_TIME = "seekTime";
    public static final String EVENT_PROP_NATURALSIZE = "naturalSize";
    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_ERROR = "error";
    public static final String EVENT_PROP_WHAT = "what";
    public static final String EVENT_PROP_EXTRA = "extra";

    private Handler mUpdateHandler = new Handler();
    private Runnable mTextUpdateRunnable = null;
    private Runnable mProgressUpdateRunnable = null;
    private String mToken = null;
    private String mSrcUriString = null;
    private ScalableType mResizeMode = ScalableType.FIT_CENTER;
    private boolean mRepeat = false;
    private boolean mPaused = true;
    private boolean mMuted = false;
    private float mVolume = 1.0f;
    private float mRate = 1.0f;
    private boolean mFullScreen = false;
    private boolean mPlayInBackground = false;
    private boolean mActiveStatePauseStatus = false;

    private boolean mMediaPlayerValid = false; // True if mMediaPlayer is in prepared, started, paused or completed state.

    private int mVideoDuration = 0;
    private int mVideoBufferedDuration = 0;
    private boolean isCompleted = false;
    private boolean mUseNativeControls = false;

    private ThemedReactContext mThemedReactContext = null;
    private OMFullScreenManager mFullScreenManager = null;
    private OMScalableVideoView mVideoView = null;
    private ViewGroup mToolbar = null;

    private OMVideoView mParentView = null;

    private Timer mHideToolbarTimer = null;

    private AudioManager mAm;

    private boolean mAutoPause = false;

    private long displayDelay = 3000;

    private final Handler mHandler = new Handler(){
        @Override
        public void handleMessage(Message msg) {
            if (msg.what == MSG_HIDETOOLBAR){
                if (mToolbar != null){
                    mToolbar.setVisibility(GONE);
                }
            }

            super.handleMessage(msg);
        }
    };

    private final View.OnClickListener onClickListener = new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            if (view.getId() == R.id.play_pause){
                setPausedModifier(!mPaused);
            }
            else if (view.getId() == R.id.fullscreen){
                mParentView.setFullscreen(!mParentView.isFullscreen());
            }
        }
    };

    private final SeekBar.OnSeekBarChangeListener mSeekListener = new SeekBar.OnSeekBarChangeListener (){
        @Override
        public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
            if (!fromUser){
                return ;
            }
            mVideoView.seekTo(progress);
            // seekTo(progress);
        }

        @Override
        public void onStartTrackingTouch(SeekBar seekBar) {

        }

        @Override
        public void onStopTrackingTouch(SeekBar seekBar) {
            WritableMap event = Arguments.createMap();
            event.putDouble(EVENT_PROP_CURRENT_TIME, mVideoView.getCurrentPosition() / 1000.0);
            event.putDouble(EVENT_PROP_SEEK_TIME, seekBar.getProgress() / 1000.0);
            sendEvent(OMVideoPlayer.Events.EVENT_SEEK.toString(), event);
        }
    };

    private AudioManager.OnAudioFocusChangeListener mAudioFocusChangeListener = new AudioManager.OnAudioFocusChangeListener() {
        @Override
        public void onAudioFocusChange(int focusChange) {
            if (focusChange == AudioManager.AUDIOFOCUS_LOSS_TRANSIENT ||
                    focusChange == AudioManager.AUDIOFOCUS_LOSS) {
                // Pause playback
                if (!mPaused) {
                    mAutoPause = true;
                    setPausedModifier(true);
                }


            } else if (focusChange == AudioManager.AUDIOFOCUS_GAIN) {
                // Resume playback
                if (mAutoPause && mPaused) {
                    setPausedModifier(false);

                }
            }
        }
    };

    private boolean requestAudioFocus() {
        // Request audio focus for playback
        int result = mAm.requestAudioFocus(mAudioFocusChangeListener,
                // Use the music stream.
                AudioManager.STREAM_MUSIC,
                // Request permanent focus.
                AudioManager.AUDIOFOCUS_GAIN);
        return result == AudioManager.AUDIOFOCUS_REQUEST_GRANTED;
    }


    private void resetToolbar(){
        ((TextView)findViewById(R.id.current_time)).setText("--:--/--:--");
        ((SeekBar)findViewById(R.id.seekbar)).setProgress(0);
        ((SeekBar)findViewById(R.id.seekbar)).setMax(0);
        ((ImageView)findViewById(R.id.play_pause)).setImageResource(R.drawable.ic_play);
    }

    public void sendEvent(String event, WritableMap params) {
        mThemedReactContext.getJSModule(RCTEventEmitter.class).receiveEvent(mParentView.getId(), event, params);
    }

    public OMVideoPlayer(ThemedReactContext themedReactContext, OMVideoView parent){
        super(themedReactContext);

        mAm = (AudioManager) themedReactContext.getSystemService(Context.AUDIO_SERVICE);

        mParentView = parent;

        mThemedReactContext = themedReactContext;
        themedReactContext.addLifecycleEventListener(this);

        View.inflate(themedReactContext, R.layout.video_player,this);
        mVideoView = (OMScalableVideoView) findViewById(R.id.video_view);
        mToolbar = (ViewGroup) findViewById(R.id.toolbar);
        findViewById(R.id.play_pause).setOnClickListener(onClickListener);
        findViewById(R.id.fullscreen).setOnClickListener(onClickListener);
        ((SeekBar)findViewById(R.id.seekbar)).setOnSeekBarChangeListener(mSeekListener);

        mTextUpdateRunnable = new Runnable() {
            @Override
            public void run() {
                if (mMediaPlayerValid && !isCompleted && !mPaused) {
                    TextView textView = ((TextView) findViewById(R.id.display_text));
                    textView.setVisibility(View.VISIBLE);
                    float limitX = 0.25f;
                    float limitY = 0.25f;
                    float textWidth = textView.getWidth();
                    float textHeight = textView.getHeight();
                    float randomX = (float) (Math.random() * (getWidth() - textWidth));
                    float randomY = (float) (Math.random() * (getHeight() - textHeight));
                    boolean isOutX = randomX > (getWidth() * limitX - textWidth) && randomX < getWidth() * (1 - limitX);
                    boolean isOutY = randomY > (getHeight() * limitY - textHeight) && randomY < getHeight() * (1 - limitY);

                    if (isOutX && isOutY) {
                        if ((randomX + textWidth / 2) > getWidth() / 2) {
                            randomX = getWidth() * (1 - limitX);
                        } else {
                            randomX = getWidth() * limitX - textWidth;
                        }
                    }
                    textView.setTranslationX(randomX);
                    textView.setTranslationY(randomY);
                    mUpdateHandler.postDelayed(mTextUpdateRunnable, displayDelay);
                }
            }
        };

        mProgressUpdateRunnable = new Runnable() {
            @Override
            public void run() {

                if (mMediaPlayerValid && !isCompleted &&!mPaused) {
                    WritableMap event = Arguments.createMap();
                    event.putDouble(EVENT_PROP_CURRENT_TIME, mVideoView.getCurrentPosition() / 1000.0);
                    event.putDouble(EVENT_PROP_PLAYABLE_DURATION, mVideoBufferedDuration / 1000.0); //TODO:mBufferUpdateRunnable
                    sendEvent(OMVideoPlayer.Events.EVENT_PROGRESS.toString(), event);

                    ((TextView)findViewById(R.id.current_time)).setText(generateTime(mVideoView.getCurrentPosition()) + "/" + generateTime(mVideoView.getDuration()));
//                    ((TextView)findViewById(R.id.end_time)).setText(generateTime(mVideoView.getDuration()));
                    ((SeekBar)findViewById(R.id.seekbar)).setProgress(mVideoView.getCurrentPosition());
                    ((SeekBar)findViewById(R.id.seekbar)).setMax(mVideoView.getDuration());

                    // Check for update after an interval
                    // TODO: The update interval is fixed at 250. There is a property in React component that defines this value. Totally ignored !!!
                    mUpdateHandler.postDelayed(mProgressUpdateRunnable, 250);
                }
            }
        };

        initializeMediaPlayerIfNeeded();

        mFullScreenManager = new OMFullScreenManager(themedReactContext);

        mVideoView.setSurfaceTextureListener(mVideoView);
    }

//    public void toggleFullscreen(){
//        mFullScreen = !mFullScreen;
//
//        if (mFullScreen){
//            mParentView.removeView(this);
//            mFullScreenManager.addView(this);
//            mFullScreenManager.show();
//            ((ImageView)findViewById(R.id.fullscreen)).setImageResource(R.drawable.shrink_fullscreen);
//        }
//        else {
//            mFullScreenManager.removeView(this);
//            mParentView.addView(this);
//            mFullScreenManager.hide();
//            ((ImageView)findViewById(R.id.fullscreen)).setImageResource(R.drawable.enlarge_fullscreen);
//            setLayoutParams(new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,ViewGroup.LayoutParams.MATCH_PARENT));
//        }
//
//        requestLayout();
//    }

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
    }

    @Override
    protected void onLayout(boolean changed, int left, int top, int right, int bottom) {
        super.onLayout(changed, left, top, right, bottom);

        if (!changed || !mMediaPlayerValid) {
            return;
        }

        int videoWidth = mVideoView.getVideoWidth();
        int videoHeight = mVideoView.getVideoHeight();

        if (videoWidth == 0 || videoHeight == 0) {
            return;
        }

        Size viewSize = new Size(getWidth(), getHeight());
        Size videoSize = new Size(videoWidth, videoHeight);
        ScaleManager scaleManager = new ScaleManager(viewSize, videoSize);
        Matrix matrix = scaleManager.getScaleMatrix(ScalableType.FIT_CENTER);
        if (matrix != null) {
            mVideoView.setTransform(matrix);
        }
    }

    private void initializeMediaPlayerIfNeeded() {
        if (mVideoView.getMediaPlayer() == null) {
            mMediaPlayerValid = false;
            MediaPlayer mediaPlayer = new MediaPlayer();
            mediaPlayer.setScreenOnWhilePlaying(true);
            mediaPlayer.setOnVideoSizeChangedListener(mVideoView);
            mediaPlayer.setOnErrorListener(this);
            mediaPlayer.setOnPreparedListener(this);
            mediaPlayer.setOnBufferingUpdateListener(this);
            mediaPlayer.setOnCompletionListener(this);
            mediaPlayer.setOnInfoListener(this);

            mVideoView.setMediaPlayer(mediaPlayer);
        }
    }

    public void cleanupMediaPlayerResources() {
        MediaPlayer mediaPlayer = mVideoView.getMediaPlayer();

        if ( mediaPlayer != null ) {
            mMediaPlayerValid = false;
            mediaPlayer.stop();
            mediaPlayer.release();
            mVideoView.setMediaPlayer(null);
        }
    }
    public void setToken(final String tokenString) {

        mToken = tokenString;
        if (mSrcUriString == null) {
            return;
        }
        setSrc(mSrcUriString);

    }

    public void setDisplayText(final String displayText) {
        TextView textView = ((TextView) findViewById(R.id.display_text));
        textView.setText(displayText);
    }

    public void setDisplayTextSize(final float displayTextSize) {
        TextView textView = ((TextView) findViewById(R.id.display_text));
        textView.setTextSize(displayTextSize);
    }

    public void setDisplayDelay(final long delay) {
        displayDelay = delay;
    }

    public void setSrc(final String uriString) {

        mSrcUriString = uriString;
        mMediaPlayerValid = false;
        mVideoDuration = 0;
        mVideoBufferedDuration = 0;
        mPaused = true;

        resetToolbar();

        initializeMediaPlayerIfNeeded();
        mVideoView.getMediaPlayer().reset();

        try {
            if (uriString.startsWith("http")) {
                // Use the shared CookieManager to access the cookies
                // set by WebViews inside the same app
                CookieManager cookieManager = CookieManager.getInstance();

                Uri parsedUrl = Uri.parse(uriString);
                Uri.Builder builtUrl = parsedUrl.buildUpon();

                String cookie = cookieManager.getCookie(builtUrl.build().toString());

                Map<String, String> headers = new HashMap<String, String>();

                if (cookie != null) {
                    headers.put("Cookie", cookie);
                }
                if (mToken != null) {
                    headers.put("User-Agent", mToken);
                } else {
                    return;
                }
                if (uriString.startsWith("http://localhost")) {
                    mVideoView.setDataSource(uriString);
                } else {
                    mVideoView.setDataSource(mThemedReactContext, parsedUrl, headers);
                }
            } else {
                if (uriString.startsWith("content://")) {
                    Uri parsedUrl = Uri.parse(uriString);
                    mVideoView.setDataSource(mThemedReactContext, parsedUrl);
                } else {
                    mVideoView.setDataSource(uriString);
                }
            }
        } catch (Exception e) {
            WritableMap event = Arguments.createMap();
            event.putString(OMVideoViewManager.PROP_SRC, uriString);
            event.putString("error", e.getMessage());
            sendEvent(OMVideoPlayer.Events.EVENT_ERROR.toString(), event);
            return;
        }

        WritableMap src = Arguments.createMap();
        src.putString(OMVideoViewManager.PROP_SRC_URI, uriString);

        WritableMap event = Arguments.createMap();
        event.putMap(OMVideoViewManager.PROP_SRC, src);
        sendEvent(OMVideoPlayer.Events.EVENT_LOAD_START.toString(), event);

        // not async to prevent random crashes on Android playback from local resource due to race conditions
        try {
            mVideoView.prepareAsync(this);
        } catch (Exception e) {
            WritableMap prepareEvent = Arguments.createMap();
            prepareEvent.putString(OMVideoViewManager.PROP_SRC, uriString);
            prepareEvent.putString("error", e.getMessage());
            sendEvent(OMVideoPlayer.Events.EVENT_ERROR.toString(), prepareEvent);
        }
    }

    public void setResizeModeModifier(final ScalableType resizeMode) {
        mResizeMode = resizeMode;

        if (mMediaPlayerValid) {
            mVideoView.setScalableType(resizeMode);
            invalidate();
        }
    }

    public void setRepeatModifier(final boolean repeat) {

        mRepeat = repeat;

        if (mMediaPlayerValid) {
            mVideoView.setLooping(repeat);
        }
    }

    public void setPausedModifier(final boolean paused) {
        mPaused = paused;

        if (!mMediaPlayerValid) {
            return;
        }

        isCompleted = false;

        if (mPaused) {
            if (mVideoView.isPlaying()) {
                mVideoView.pause();
                ((ImageView)findViewById(R.id.play_pause)).setImageResource(R.drawable.ic_play);

                sendEvent(Events.EVENT_STALLED.toString(), Arguments.createMap());
            }
        } else {
            if (!mVideoView.isPlaying() && requestAudioFocus()) {
                mVideoView.start();
                mAutoPause = false;
                ((ImageView)findViewById(R.id.play_pause)).setImageResource(R.drawable.ic_pause);
                // Also Start the Progress Update Handler
                mUpdateHandler.post(mProgressUpdateRunnable);
                mUpdateHandler.post(mTextUpdateRunnable);
                sendEvent(Events.EVENT_RESUME.toString(), Arguments.createMap());
            }
        }
    }

    public boolean isPlaying() {
        return !mPaused;
    }

    public void setMutedModifier(final boolean muted) {
        mMuted = muted;

        if (!mMediaPlayerValid) {
            return;
        }

        if (mMuted) {
            mVideoView.setVolume(0, 0);
        } else {
            mVideoView.setVolume(mVolume, mVolume);
        }
    }

    public void setVolumeModifier(final float volume) {
        mVolume = volume;
        setMutedModifier(mMuted);
    }

    public void setRateModifier(final float rate) {
        mRate = rate;

        if (mMediaPlayerValid) {
            // TODO: Implement this.
            Log.e(OMVideoViewManager.REACT_CLASS, "Setting playback rate is not yet supported on Android");
        }
    }

    public void applyModifiers() {
        setResizeModeModifier(mResizeMode);
        setRepeatModifier(mRepeat);
        setPausedModifier(mPaused);
        setMutedModifier(mMuted);
//        setRateModifier(mRate);
    }

    public void setPlayInBackground(final boolean playInBackground) {

        mPlayInBackground = playInBackground;
    }

    public void setControls(boolean controls) {
        this.mUseNativeControls = controls;
    }


    @Override
    public void onPrepared(MediaPlayer mp) {

        mMediaPlayerValid = true;
        mVideoDuration = mp.getDuration();

        ((TextView)findViewById(R.id.current_time)).setText(generateTime(mp.getCurrentPosition()) + "/" + generateTime(mp.getDuration()));
//        ((TextView)findViewById(R.id.end_time)).setText(generateTime(mp.getDuration()));
        ((SeekBar)findViewById(R.id.seekbar)).setMax(mp.getDuration());

        WritableMap naturalSize = Arguments.createMap();
        naturalSize.putInt(EVENT_PROP_WIDTH, mp.getVideoWidth());
        naturalSize.putInt(EVENT_PROP_HEIGHT, mp.getVideoHeight());
        if (mp.getVideoWidth() > mp.getVideoHeight())
            naturalSize.putString(EVENT_PROP_ORIENTATION, "landscape");
        else
            naturalSize.putString(EVENT_PROP_ORIENTATION, "portrait");

        WritableMap event = Arguments.createMap();
        event.putDouble(EVENT_PROP_DURATION, mVideoDuration / 1000.0);
        event.putDouble(EVENT_PROP_CURRENT_TIME, mp.getCurrentPosition() / 1000.0);
        event.putMap(EVENT_PROP_NATURALSIZE, naturalSize);
        // TODO: Actually check if you can.
        event.putBoolean(EVENT_PROP_FAST_FORWARD, true);
        event.putBoolean(EVENT_PROP_SLOW_FORWARD, true);
        event.putBoolean(EVENT_PROP_SLOW_REVERSE, true);
        event.putBoolean(EVENT_PROP_REVERSE, true);
        event.putBoolean(EVENT_PROP_FAST_FORWARD, true);
        event.putBoolean(EVENT_PROP_STEP_BACKWARD, true);
        event.putBoolean(EVENT_PROP_STEP_FORWARD, true);
        sendEvent(OMVideoPlayer.Events.EVENT_LOAD.toString(), event);

        showToolbar();

        applyModifiers();
    }

    @Override
    public boolean onError(MediaPlayer mp, int what, int extra) {

        WritableMap error = Arguments.createMap();
        error.putInt(EVENT_PROP_WHAT, what);
        error.putInt(EVENT_PROP_EXTRA, extra);
        WritableMap event = Arguments.createMap();
        event.putMap(EVENT_PROP_ERROR, error);
        sendEvent( OMVideoPlayer.Events.EVENT_ERROR.toString(), event);
        return true;
    }

    @Override
    public boolean onInfo(MediaPlayer mp, int what, int extra) {
        switch (what) {
            case MediaPlayer.MEDIA_INFO_BUFFERING_START:
                sendEvent(OMVideoPlayer.Events.EVENT_LOAD_STALLED.toString(), Arguments.createMap());
                break;
            case MediaPlayer.MEDIA_INFO_BUFFERING_END:
                sendEvent(OMVideoPlayer.Events.EVENT_LOAD_RESUME.toString(), Arguments.createMap());
                break;
            case MediaPlayer.MEDIA_INFO_VIDEO_RENDERING_START:
                sendEvent(OMVideoPlayer.Events.EVENT_READY_FOR_DISPLAY.toString(), Arguments.createMap());
                break;

            default:
        }
        return false;
    }

    @Override
    public void onBufferingUpdate(MediaPlayer mp, int percent) {
        mVideoBufferedDuration = (int) Math.round((double) (mVideoDuration * percent) / 100.0);
    }

    public void seekTo(int msec) {

        if (mMediaPlayerValid) {
            WritableMap event = Arguments.createMap();
            event.putDouble(EVENT_PROP_CURRENT_TIME, mVideoView.getCurrentPosition() / 1000.0);
            event.putDouble(EVENT_PROP_SEEK_TIME, msec / 1000.0);
            sendEvent(OMVideoPlayer.Events.EVENT_SEEK.toString(), event);

            mVideoView.seekTo(msec);
            if (isCompleted && mVideoDuration != 0 && msec < mVideoDuration) {
                isCompleted = false;
            }
        }
    }

    @Override
    public void onCompletion(MediaPlayer mp) {

        isCompleted = true;
        mPaused = true;

        sendEvent(OMVideoPlayer.Events.EVENT_END.toString(), null);

//        ((TextView)findViewById(R.id.current_time)).setText("00:00/" + generateTime(mVideoView.getDuration()));
//        ((TextView)findViewById(R.id.end_time)).setText(generateTime(mVideoView.getDuration()));
//        ((ImageView)findViewById(R.id.play_pause)).setImageResource(R.drawable.ic_play);
//        ((SeekBar)findViewById(R.id.seekbar)).setMax(mp.getDuration());
//        ((SeekBar)findViewById(R.id.seekbar)).setProgress(0);

        mAm.abandonAudioFocus(mAudioFocusChangeListener);
        resetToolbar();

        mp.seekTo(0);
    }


    @Override
    protected void onDetachedFromWindow() {

//        mMediaPlayerValid = false;
//        mVideoView.pause();
        super.onDetachedFromWindow();
    }

    @Override
    protected void onAttachedToWindow() {
//        if (!mFullScreen){
//            mParentView = (ViewGroup)getParent();
//        }

//        mMediaPlayerValid = true;

        super.onAttachedToWindow();
//        mVideoView.start();
//        setSrc(mSrcUriString);

//        requestLayout();
    }

    @Override
    public void onHostPause() {
//        if (mVideoView.getMediaPlayer() != null && !mPlayInBackground) {
//            mActiveStatePauseStatus = mPaused;
//
//            // Pause the video in background
//            setPausedModifier(true);
//        }
    }

    @Override
    public void onHostResume() {
//        if (mVideoView.getMediaPlayer() != null && !mPlayInBackground) {
//            new Handler().post(new Runnable() {
//                @Override
//                public void run() {
//                    // Restore original state
//                    setPausedModifier(mActiveStatePauseStatus);
//                }
//            });
//
//        }
    }

    @Override
    public void onHostDestroy() {
    }

    private String generateTime(long time) {
        int totalSeconds = (int) (time / 1000);
        int seconds = totalSeconds % 60;
        int minutes = (totalSeconds / 60) % 60;
        int hours = totalSeconds / 3600;
        return hours > 0 ? String.format("%02d:%02d:%02d", hours, minutes,
                seconds) : String.format("%02d:%02d", minutes, seconds);
    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        if (event.getAction() == MotionEvent.ACTION_DOWN){
            showToolbar();
        }

        return super.onTouchEvent(event);
    }

    public void showToolbar(){
        if (mToolbar == null){
            return;
        }

        if (mHideToolbarTimer != null){
            mHideToolbarTimer.cancel();
            mHideToolbarTimer = null;

            mToolbar.setVisibility(GONE);

            return ;
        }

        mToolbar.setVisibility(VISIBLE);

        mHideToolbarTimer = new Timer();

        mHideToolbarTimer.schedule(new TimerTask() {
            @Override
            public void run() {
                Message msg = new Message();
                msg.what = MSG_HIDETOOLBAR;
                mHandler.sendMessage(msg);

                mHideToolbarTimer = null;
            }
        },10 * 1000);
    }

    public void setFullScreen(boolean fullscreen) {
        if (fullscreen) {
            ((ImageView)findViewById(R.id.fullscreen)).setImageResource(R.drawable.shrink_fullscreen);
        }
        else {
            ((ImageView)findViewById(R.id.fullscreen)).setImageResource(R.drawable.enlarge_fullscreen);
        }
    }
}
