PlayerInfoView.java 6.22 KB
package com.cnlive.gundam.video.view;

import android.app.Activity;
import android.content.Context;
import android.content.pm.ActivityInfo;
import android.databinding.DataBindingUtil;
import android.databinding.ObservableBoolean;
import android.databinding.ObservableField;
import android.databinding.ObservableInt;
import android.databinding.ViewDataBinding;
import android.util.AttributeSet;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.RelativeLayout;

import com.cnlive.gundam.BR;
import com.cnlive.gundam.R;
import com.cnlive.gundam.video.utils.NetworkUtil;
import com.cnlive.gundam.video.utils.PlayerUtils;

/**
 * Created by gujun on 2017/5/22.
 */

public class PlayerInfoView extends RelativeLayout {
    public static final int ID_CLICK_INFO_RETRY = 0x3001;
    public static final int ID_CLICK_INFO_REPLAY = 0x3002;
    public static final int ID_CLICK_INFO_MOBILE_NET_PLAY = 0x3003;

    public static final int VIDEO_INFO_NORMAL = 0x1001;
    public static final int VIDEO_INFO_UGC = 0x1002;

    //隐藏所有视图
    public static final int SHOW_NULL = 0x2001;
    //展示loading视图
    public static final int SHOW_LOADING = 0x2002;
    //展示缓冲视图
    public static final int SHOW_BUFFERING = 0x2003;
    //展示error视图
    public static final int SHOW_ERROR = 0x2004;
    //展示end视图
    public static final int SHOW_END = 0x2005;
    //展示ugcLive状态页 只有ugc直播才有此功能页
    public static final int SHOW_UGC_LIVE_STATUS = 0x2006;
    //展示手机网视图
    public static final int SHOW_MOBILE_NET = 0x2007;


    //存储展示哪个视图
    private ObservableInt observableShowType;
    //存储状态提示信息
    private ObservableField<String> observableStatusMsg;
    //存储是否是快新闻类型
    private ObservableBoolean observableIsNews;
    //存储是否是快新闻类型
    private ObservableBoolean observableIsPortrait;
    //
    private ObservableField<String> observableErrorMsg;
    //记录当前view是否展示
    private boolean isShow = false;
    //记录当前视频是否是ugc
    private boolean isUgc = false;

    private VideoInfoListener l;

    public PlayerInfoView(Context context) {
        this(context, null);
    }

    public PlayerInfoView(Context context, AttributeSet attrs) {
        this(context, attrs, 0);
    }

    public PlayerInfoView(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        init();
    }

    private void init() {
        observableShowType = new ObservableInt();
        observableStatusMsg = new ObservableField<>();
        observableIsNews = new ObservableBoolean();
        observableIsPortrait = new ObservableBoolean();
        observableErrorMsg = new ObservableField<>();
        observableIsPortrait.set(PlayerUtils.isPortrait(getContext()));
    }

    public void setInfoListener(VideoInfoListener listener) {
        l = listener;
    }

    public void setInfoViewLayout(int infoType) {
        switch (infoType) {
            case VIDEO_INFO_NORMAL:
                ViewDataBinding binding = DataBindingUtil.bind(getView(R.layout.layout_player_info));
                binding.setVariable(BR.playerInfoView, this);
                binding.setVariable(BR.showType, observableShowType);
                binding.setVariable(BR.isNews, observableIsNews);
                binding.setVariable(BR.isPortrait, observableIsPortrait);
                binding.setVariable(BR.errorMsg, observableErrorMsg);
                isUgc = false;
                break;
            case VIDEO_INFO_UGC:
                binding = DataBindingUtil.bind(getView(R.layout.layout_player_ugc_info));
                binding.setVariable(BR.playerInfoView, this);
                binding.setVariable(BR.showType, observableShowType);
                binding.setVariable(BR.statusMsg, observableStatusMsg);
                binding.setVariable(BR.errorMsg, observableErrorMsg);
                isUgc = true;
                break;
        }
    }

    //屏幕转换
    public void onScreenChange(boolean isPortrait) {
        observableIsPortrait.set(isPortrait);
    }

    //获取对应布局的视图
    private View getView(int layout) {
        View view = LayoutInflater.from(getContext()).inflate(layout, null, false);
        if (getChildCount() > 0)
            removeAllViews();
        addView(view);
        return view;
    }

    //当前view是否有视图显示
    public boolean isShow() {
        return isShow;
    }

    //展示对应视图
    public void show(int type) {
        isShow = true;
        observableShowType.set(type);
        switch (type) {
            case SHOW_NULL:
            case SHOW_BUFFERING:
                isShow = false;
                break;
            case SHOW_ERROR:
                observableErrorMsg.set(getErrorMsg());
                break;
        }
    }

    //获取当前展示的视图的type
    public int getCurInfoType() {
        return observableShowType.get();
    }

    public void show(int type, String statusMsg) {
        observableStatusMsg.set(statusMsg);
        show(type);
    }

    public void onClick(View v) {
        switch (v.getId()) {
            case R.id.retry:
                if (l != null) l.onInfoViewClick(ID_CLICK_INFO_RETRY);
                break;
            case R.id.replay:
                if (l != null) l.onInfoViewClick(ID_CLICK_INFO_REPLAY);
                break;
            case R.id.back:
                if (!PlayerUtils.isPortrait(getContext()) && !isUgc) {
                    ((Activity) getContext()).setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
                } else {
                    ((Activity) getContext()).onBackPressed();
                }
                break;
            case R.id.playByMobileNet:
                if (l != null) l.onInfoViewClick(ID_CLICK_INFO_MOBILE_NET_PLAY);
                break;
        }
    }

    /**
     * 获取播放失败提示文字
     *
     * @return
     */
    private String getErrorMsg() {
        return getContext().getResources().getString(NetworkUtil.isConnectInternet(getContext()) ? R.string.player_error : R.string.player_error_net);
    }

    public interface VideoInfoListener {
        void onInfoViewClick(int id);
    }

}