package com.netease.nim.demo.avchat; import android.content.Context; import android.graphics.Rect; import android.view.View; import android.widget.Chronometer; import android.widget.ImageView; import android.widget.TextView; import android.widget.Toast; import com.netease.nim.uikit.cache.NimUserInfoCache; import com.netease.nim.demo.R; import com.netease.nim.demo.avchat.constant.CallStateEnum; import com.netease.nim.demo.avchat.widgets.ToggleListener; import com.netease.nim.demo.avchat.widgets.ToggleState; import com.netease.nim.demo.avchat.widgets.ToggleView; import com.netease.nim.uikit.common.ui.imageview.HeadImageView; import com.netease.nimlib.sdk.avchat.AVChatManager; /** * 视频管理器, 视频界面初始化和相关管理 * Created by hzxuwen on 2015/5/5. */ public class AVChatVideo implements View.OnClickListener, ToggleListener{ // data private Context context; private View root; private AVChatUI manager; //顶部控制按钮 private View topRoot; private View switchAudio; private Chronometer time; private TextView netUnstableTV; //中间控制按钮 private View middleRoot; private HeadImageView headImg; private TextView nickNameTV; private TextView notifyTV; private View refuse_receive; private TextView refuseTV; private TextView receiveTV; //底部控制按钮 private View bottomRoot; ToggleView switchCameraToggle; ToggleView closeCameraToggle; ToggleView muteToggle; ImageView recordToggle; ImageView hangUpImg; //摄像头权限提示显示 private View permissionRoot; //record private View recordView; private View recordTip; private View recordWarning; private int topRootHeight = 0; private int bottomRootHeight = 0; private AVChatUIListener listener; // state private boolean init = false; private boolean shouldEnableToggle = false; private boolean isInSwitch = false; public AVChatVideo(Context context, View root, AVChatUIListener listener, AVChatUI manager) { this.context = context; this.root = root; this.listener = listener; this.manager = manager; } private void findViews() { if(init || root == null ) return; topRoot = root.findViewById(R.id.avchat_video_top_control); switchAudio = topRoot.findViewById(R.id.avchat_video_switch_audio); switchAudio.setOnClickListener(this); time = (Chronometer) topRoot.findViewById(R.id.avchat_video_time); netUnstableTV = (TextView) topRoot.findViewById(R.id.avchat_video_netunstable); middleRoot = root.findViewById(R.id.avchat_video_middle_control); headImg = (HeadImageView) middleRoot.findViewById(R.id.avchat_video_head); nickNameTV = (TextView) middleRoot.findViewById(R.id.avchat_video_nickname); notifyTV = (TextView) middleRoot.findViewById(R.id.avchat_video_notify); refuse_receive = middleRoot.findViewById(R.id.avchat_video_refuse_receive); refuseTV = (TextView) refuse_receive.findViewById(R.id.refuse); receiveTV = (TextView) refuse_receive.findViewById(R.id.receive); refuseTV.setOnClickListener(this); receiveTV.setOnClickListener(this); recordView = root.findViewById(R.id.avchat_record_layout); recordTip = recordView.findViewById(R.id.avchat_record_tip); recordWarning = recordView.findViewById(R.id.avchat_record_warning); bottomRoot = root.findViewById(R.id.avchat_video_bottom_control); switchCameraToggle = new ToggleView(bottomRoot.findViewById(R.id.avchat_switch_camera), ToggleState.DISABLE, this); closeCameraToggle = new ToggleView(bottomRoot.findViewById(R.id.avchat_close_camera), ToggleState.DISABLE, this); muteToggle = new ToggleView(bottomRoot.findViewById(R.id.avchat_video_mute), ToggleState.DISABLE, this); recordToggle = (ImageView) bottomRoot.findViewById(R.id.avchat_video_record); recordToggle.setEnabled(false); recordToggle.setOnClickListener(this); hangUpImg = (ImageView) bottomRoot.findViewById(R.id.avchat_video_logout); hangUpImg.setOnClickListener(this); permissionRoot = root.findViewById(R.id.avchat_video_permission_control); init = true; } /** * 音视频状态变化及界面刷新 * @param state */ public void onCallStateChange(CallStateEnum state) { if(CallStateEnum.isVideoMode(state)) findViews(); switch (state){ case OUTGOING_VIDEO_CALLING: showProfile();//对方的详细信息 showNotify(R.string.avchat_wait_recieve); setRefuseReceive(false); shouldEnableToggle = true; enableCameraToggle(); //使用音视频预览时这里可以开启切换摄像头按钮 setTopRoot(false); setMiddleRoot(true); setBottomRoot(true); break; case INCOMING_VIDEO_CALLING: showProfile();//对方的详细信息 showNotify(R.string.avchat_video_call_request); setRefuseReceive(true); receiveTV.setText(R.string.avchat_pickup); setTopRoot(false); setMiddleRoot(true); setBottomRoot(false); break; case VIDEO: isInSwitch = false; enableToggle(); setTime(true); setTopRoot(true); setMiddleRoot(false); setBottomRoot(true); showNoneCameraPermissionView(false); break; case VIDEO_CONNECTING: showNotify(R.string.avchat_connecting); shouldEnableToggle = true; break; case OUTGOING_AUDIO_TO_VIDEO: isInSwitch = true; setTime(true); setTopRoot(true); setMiddleRoot(false); setBottomRoot(true); break; default: break; } setRoot(CallStateEnum.isVideoMode(state)); } /********************** 界面显示 **********************************/ /** * 显示个人信息 */ private void showProfile(){ String account = manager.getAccount(); headImg.loadBuddyAvatar(account); nickNameTV.setText(NimUserInfoCache.getInstance().getUserDisplayName(account)); } /** * 显示通知 * @param resId */ private void showNotify(int resId){ notifyTV.setText(resId); notifyTV.setVisibility(View.VISIBLE); } /************************ 布局显隐设置 ****************************/ private void setRoot(boolean visible) { root.setVisibility(visible ? View.VISIBLE : View.GONE); } private void setRefuseReceive(boolean visible){ refuse_receive.setVisibility(visible ? View.VISIBLE : View.GONE); } private void setTopRoot(boolean visible){ topRoot.setVisibility(visible ? View.VISIBLE : View.GONE); if(topRootHeight == 0){ Rect rect = new Rect(); topRoot.getGlobalVisibleRect(rect); topRootHeight = rect.bottom; } } private void setMiddleRoot(boolean visible){ middleRoot.setVisibility(visible ? View.VISIBLE : View.GONE); } private void setBottomRoot(boolean visible){ bottomRoot.setVisibility(visible ? View.VISIBLE : View.GONE); if(bottomRootHeight == 0){ bottomRootHeight = bottomRoot.getHeight(); } } private void setTime(boolean visible){ time.setVisibility(visible ? View.VISIBLE : View.GONE); if(visible){ time.setBase(manager.getTimeBase()); time.start(); } } /** * 底部控制开关可用 */ private void enableToggle() { if (shouldEnableToggle) { if (manager.canSwitchCamera() && AVChatManager.getInstance().hasMultipleCameras()) switchCameraToggle.enable(); closeCameraToggle.enable(); muteToggle.enable(); recordToggle.setEnabled(true); shouldEnableToggle = false; } } private void enableCameraToggle() { if (shouldEnableToggle) { if (manager.canSwitchCamera() && AVChatManager.getInstance().hasMultipleCameras()) switchCameraToggle.enable(); } } @Override public void onClick(View v) { switch (v.getId()) { case R.id.avchat_video_logout: listener.onHangUp(); break; case R.id.refuse: listener.onRefuse(); break; case R.id.receive: listener.onReceive(); break; case R.id.avchat_video_mute: listener.toggleMute(); break; case R.id.avchat_video_switch_audio: if(isInSwitch) { Toast.makeText(context, R.string.avchat_in_switch, Toast.LENGTH_SHORT).show(); } else { listener.videoSwitchAudio(); } break; case R.id.avchat_switch_camera: listener.switchCamera(); break; case R.id.avchat_close_camera: listener.closeCamera(); break; case R.id.avchat_video_record: listener.toggleRecord(); break; default: break; } } public void showRecordView(boolean show, boolean warning) { if(show) { recordToggle.setEnabled(true); recordToggle.setSelected(true); recordView.setVisibility(View.VISIBLE); recordTip.setVisibility(View.VISIBLE); if(warning) { recordWarning.setVisibility(View.VISIBLE); } else { recordWarning.setVisibility(View.GONE); } } else { recordToggle.setSelected(false); recordView.setVisibility(View.INVISIBLE); recordTip.setVisibility(View.INVISIBLE); recordWarning.setVisibility(View.GONE); } } public void showNoneCameraPermissionView(boolean show) { permissionRoot.setVisibility(show ? View.VISIBLE : View.GONE); } /** * 音频切换为视频, 界面控件是否开启显示 * @param muteOn */ public void onAudioToVideo(boolean muteOn, boolean recordOn, boolean recordWarning){ muteToggle.toggle(muteOn ? ToggleState.ON : ToggleState.OFF); closeCameraToggle.toggle(ToggleState.OFF); if(manager.canSwitchCamera()){ switchCameraToggle.off(false); } recordToggle.setEnabled(true); recordToggle.setSelected(recordOn); showRecordView(recordOn, recordWarning); } /******************************* toggle listener *************************/ @Override public void toggleOn(View v) { onClick(v); } @Override public void toggleOff(View v) { onClick(v); } @Override public void toggleDisable(View v) { } public void closeSession(int exitCode){ if(init){ time.stop(); switchCameraToggle.disable(false); muteToggle.disable(false); recordToggle.setEnabled(false); closeCameraToggle.disable(false); receiveTV.setEnabled(false); refuseTV.setEnabled(false); hangUpImg.setEnabled(false); } } }