package com.anbetter.xplayer.ijk;

import android.annotation.TargetApi;
import android.content.Context;
import android.graphics.SurfaceTexture;
import android.os.Build;
import android.util.AttributeSet;
import android.view.Surface;
import android.view.TextureView;
import android.view.View;

import com.anbetter.log.MLog;
import com.anbetter.xplayer.ijk.api.IXRenderView;
import com.anbetter.xplayer.ijk.utils.ViewMeasureUtils;

/**
 * 视频画面渲染视图,继承自TextureView
 * 支持View的常用动画效果,不会有黑边、黑屏产生,可以在列表中使用
 * <p>
 * Created by android_ls on 2018/4/19.
 *
 * @author android_ls
 * @version 1.0
 */
public class TextureRenderView extends TextureView implements TextureView.SurfaceTextureListener, IXRenderView {

    private ViewMeasureUtils mMeasureHelper;
    private Surface mSurface;
    private OnSurfaceStatusListener mOnSurfaceStatusListener;

    public TextureRenderView(Context context) {
        super(context);
        setup(context);
    }

    public TextureRenderView(Context context, AttributeSet attrs) {
        super(context, attrs);
        setup(context);
    }

    public TextureRenderView(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        setup(context);
    }

    @TargetApi(Build.VERSION_CODES.LOLLIPOP)
    public TextureRenderView(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
        super(context, attrs, defStyleAttr, defStyleRes);
        setup(context);
    }

    private void setup(Context context) {
        mMeasureHelper = new ViewMeasureUtils(this);
        setSurfaceTextureListener(this);
    }

    @Override
    public View getView() {
        return this;
    }

    @Override
    public void setVideoSize(int videoWidth, int videoHeight) {
        if (videoWidth > 0 && videoHeight > 0) {
            mMeasureHelper.setVideoSize(videoWidth, videoHeight);
            requestLayout();
        }
    }

    @Override
    public void setVideoSampleAspectRatio(int videoSarNum, int videoSarDen) {
        if (videoSarNum > 0 && videoSarDen > 0) {
            mMeasureHelper.setVideoSampleAspectRatio(videoSarNum, videoSarDen);
            requestLayout();
        }
    }

    @Override
    public void setVideoRotation(int degree) {
        mMeasureHelper.setVideoRotation(degree);
        setRotation(degree);
    }

    @Override
    public void setAspectRatio(int aspectRatio) {
        mMeasureHelper.setAspectRatio(aspectRatio);
        requestLayout();
    }

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        mMeasureHelper.measure(widthMeasureSpec, heightMeasureSpec);
        setMeasuredDimension(mMeasureHelper.getMeasuredWidth(), mMeasureHelper.getMeasuredHeight());
    }

    @Override
    public Surface getSurface() {
        return mSurface;
    }

    @Override
    public void setOnSurfaceStatusListener(OnSurfaceStatusListener onSurfaceStatusListener) {
        mOnSurfaceStatusListener = onSurfaceStatusListener;
    }

    @Override
    public void onSurfaceTextureAvailable(SurfaceTexture surface, int width, int height) {
        // 在SurfaceTexture准备使用时调用。
        MLog.i("================onSurfaceTextureAvailable");

        mSurface = new Surface(surface);
        if (mOnSurfaceStatusListener != null) {
            MLog.i("=========22=======onSurfaceTextureAvailable");
            mOnSurfaceStatusListener.onSurfaceCreated(mSurface, width, height);
        }
    }

    @Override
    public void onSurfaceTextureSizeChanged(SurfaceTexture surface, int width, int height) {
        // 当SurfaceTexture缓冲区大小更改时调用。
        MLog.i("================onSurfaceTextureSizeChanged");

        if (mOnSurfaceStatusListener != null) {
            MLog.i("========22========onSurfaceTextureSizeChanged");
            mOnSurfaceStatusListener.onSurfaceSizeChanged(mSurface, width, height);
        }
    }

    @Override
    public void onSurfaceTextureUpdated(SurfaceTexture surface) {
//        MLog.i("================onSurfaceTextureUpdated");
        // 当指定SurfaceTexture的更新时调用updateTexImage()。
    }

    @Override
    public boolean onSurfaceTextureDestroyed(SurfaceTexture surface) {
        // 当指定SurfaceTexture即将被销毁时调用。如果返回true,则调用此方法后,表面纹理中不会发生渲染。
        // 如果返回false,则客户端需要调用release()。大多数应用程序应该返回true。
        MLog.i("================onSurfaceTextureDestroyed");

        if (mOnSurfaceStatusListener != null) {
            MLog.i("=========22=======onSurfaceTextureDestroyed");
            mOnSurfaceStatusListener.onSurfaceDestroyed(mSurface);
        }
        return true;
    }

}