package com.netease.nim.demo.avchat; import android.content.Context; import android.graphics.drawable.Drawable; import android.view.View; import android.widget.Button; import android.widget.Chronometer; import android.widget.TextView; import android.widget.Toast; import com.netease.nim.demo.DemoCache; 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.nim.uikit.common.util.sys.NetworkUtil; /** * 音频管理器, 音频界面初始化和管理 * Created by hzxuwen on 2015/4/24. */ public class AVChatAudio implements View.OnClickListener, ToggleListener{ // constant private static final int[] NETWORK_GRADE_DRAWABLE = new int[]{R.drawable.network_grade_0,R.drawable.network_grade_1,R.drawable.network_grade_2,R.drawable.network_grade_3}; private static final int[] NETWORK_GRADE_LABEL = new int[]{R.string.avchat_network_grade_0,R.string.avchat_network_grade_1,R.string.avchat_network_grade_2,R.string.avchat_network_grade_3}; private Context context; // view private View rootView ; private View switchVideo; private HeadImageView headImg; private TextView nickNameTV; private Chronometer time; private TextView wifiUnavailableNotifyTV; private TextView notifyTV; private TextView netUnstableTV; private View mute_speaker_hangup; private ToggleView muteToggle; private ToggleView speakerToggle; private View recordToggle; private Button recordToggleButton; private View hangup; private View refuse_receive; private TextView refuseTV; private TextView receiveTV; //record private View recordView; private View recordTip; private View recordWarning; // data private AVChatUI manager; private AVChatUIListener listener; // state private boolean init = false; // is in switch private boolean isInSwitch = false; public AVChatAudio(Context context, View root, AVChatUIListener listener, AVChatUI manager) { this.context = context; this.rootView = root; this.listener = listener; this.manager = manager; } /** * 音视频状态变化及界面刷新 * @param state */ public void onCallStateChange(CallStateEnum state){ if(CallStateEnum.isAudioMode(state)) findViews(); switch (state){ case OUTGOING_AUDIO_CALLING: //拨打出的免费通话 setSwitchVideo(false); showProfile();//对方的详细信息 showNotify(R.string.avchat_wait_recieve); setWifiUnavailableNotifyTV(true); setMuteSpeakerHangupControl(true); setRefuseReceive(false); break; case INCOMING_AUDIO_CALLING://免费通话请求 setSwitchVideo(false); showProfile();//对方的详细信息 showNotify(R.string.avchat_audio_call_request); setMuteSpeakerHangupControl(false); setRefuseReceive(true); receiveTV.setText(R.string.avchat_pickup); break; case AUDIO: isInSwitch = false; setWifiUnavailableNotifyTV(false); showNetworkCondition(1); showProfile(); setSwitchVideo(true); setTime(true); hideNotify(); setMuteSpeakerHangupControl(true); setRefuseReceive(false); enableToggle(); break; case AUDIO_CONNECTING: showNotify(R.string.avchat_connecting); break; case INCOMING_AUDIO_TO_VIDEO: isInSwitch = true; showNotify(R.string.avchat_audio_to_video_invitation); setMuteSpeakerHangupControl(false); setRefuseReceive(true); receiveTV.setText(R.string.avchat_receive); break; default: break; } setRoot(CallStateEnum.isAudioMode(state)); } private boolean isEnabled = false; private void enableToggle() { if(!isEnabled) { recordToggle.setEnabled(true); } isEnabled = true; } /** * 界面初始化 */ private void findViews() { if(init || rootView == null){ return; } switchVideo = rootView.findViewById(R.id.avchat_audio_switch_video); switchVideo.setOnClickListener(this); headImg = (HeadImageView) rootView.findViewById(R.id.avchat_audio_head); nickNameTV = (TextView) rootView.findViewById(R.id.avchat_audio_nickname); time = (Chronometer) rootView.findViewById(R.id.avchat_audio_time); wifiUnavailableNotifyTV = (TextView) rootView.findViewById(R.id.avchat_audio_wifi_unavailable); notifyTV = (TextView) rootView.findViewById(R.id.avchat_audio_notify); netUnstableTV = (TextView) rootView.findViewById(R.id.avchat_audio_netunstable); mute_speaker_hangup = rootView.findViewById(R.id.avchat_audio_mute_speaker_huangup); View mute = mute_speaker_hangup.findViewById(R.id.avchat_audio_mute); muteToggle = new ToggleView(mute, ToggleState.OFF, this); View speaker = mute_speaker_hangup.findViewById(R.id.avchat_audio_speaker); speakerToggle = new ToggleView(speaker, ToggleState.OFF, this); recordToggle = mute_speaker_hangup.findViewById(R.id.avchat_audio_record); recordToggleButton = (Button) mute_speaker_hangup.findViewById(R.id.avchat_audio_record_button); hangup = mute_speaker_hangup.findViewById(R.id.avchat_audio_hangup); hangup.setOnClickListener(this); recordToggle.setOnClickListener(this); recordToggle.setEnabled(false); refuse_receive = rootView.findViewById(R.id.avchat_audio_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 = rootView.findViewById(R.id.avchat_record_layout); recordTip = rootView.findViewById(R.id.avchat_record_tip); recordWarning = rootView.findViewById(R.id.avchat_record_warning); init = true; } /** * ********************************* 界面设置 ************************************* */ /** * 个人信息设置 */ 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 hideNotify(){ notifyTV.setVisibility(View.GONE); } public void showRecordView(boolean show, boolean warning) { if(show) { recordToggle.setSelected(true); recordToggleButton.setText("结束"); recordView.setVisibility(View.VISIBLE); recordTip.setVisibility(View.VISIBLE); if(warning) { recordWarning.setVisibility(View.VISIBLE); } else { recordWarning.setVisibility(View.GONE); } } else { recordToggle.setSelected(false); recordToggleButton.setText("录制"); recordView.setVisibility(View.INVISIBLE); recordTip.setVisibility(View.INVISIBLE); recordWarning.setVisibility(View.GONE); } } /** * 显示网络状态 * @param grade */ public void showNetworkCondition(int grade){ if(grade >= 0 && grade < NETWORK_GRADE_DRAWABLE.length){ netUnstableTV.setText(NETWORK_GRADE_LABEL[grade]); Drawable drawable = DemoCache.getContext().getResources().getDrawable(NETWORK_GRADE_DRAWABLE[grade]); if(drawable != null){ drawable.setBounds(0,0,drawable.getIntrinsicWidth(),drawable.getIntrinsicHeight()); netUnstableTV.setCompoundDrawables(null,null,drawable,null); } netUnstableTV.setVisibility(View.VISIBLE); } } /** * ***************************** 布局显隐设置 *********************************** */ private void setRoot(boolean visible){ rootView.setVisibility(visible ? View.VISIBLE : View.GONE); } /** * 显示或隐藏音视频切换 * @param visible */ private void setSwitchVideo(boolean visible){ switchVideo.setVisibility(visible ? View.VISIBLE : View.GONE); } /** * 显示或者隐藏是否为wifi的提示 * @param show */ private void setWifiUnavailableNotifyTV(boolean show){ if(show && !NetworkUtil.isWifi(DemoCache.getContext())){ wifiUnavailableNotifyTV.setVisibility(View.VISIBLE); }else { wifiUnavailableNotifyTV.setVisibility(View.GONE); } } /** * 显示或隐藏禁音,结束通话布局 * @param visible */ private void setMuteSpeakerHangupControl(boolean visible){ mute_speaker_hangup.setVisibility(visible ? View.VISIBLE : View.GONE); } /** * 显示或隐藏拒绝,开启布局 * @param visible */ private void setRefuseReceive(boolean visible){ refuse_receive.setVisibility(visible ? View.VISIBLE : View.GONE); } /** * 设置通话时间显示 * @param visible */ private void setTime(boolean visible){ time.setVisibility(visible ? View.VISIBLE : View.GONE); if(visible){ time.setBase(manager.getTimeBase()); time.start(); } } /** * 视频切换为音频时,禁音与扬声器按钮状态 * @param muteOn * @param speakerOn */ public void onVideoToAudio(boolean muteOn , boolean speakerOn, boolean recordOn, boolean recordWarning) { muteToggle.toggle(muteOn ? ToggleState.ON : ToggleState.OFF); speakerToggle.toggle(speakerOn ? ToggleState.ON : ToggleState.OFF); recordToggle.setSelected(recordOn); showRecordView(recordOn, recordWarning); } @Override public void onClick(View v) { switch (v.getId()) { case R.id.avchat_audio_hangup: listener.onHangUp(); break; case R.id.refuse: listener.onRefuse(); break; case R.id.receive: listener.onReceive(); break; case R.id.avchat_audio_mute: listener.toggleMute(); break; case R.id.avchat_audio_speaker: listener.toggleSpeaker(); break; case R.id.avchat_audio_switch_video: if(isInSwitch) { Toast.makeText(context, R.string.avchat_in_switch, Toast.LENGTH_SHORT).show(); }else { listener.audioSwitchVideo(); } break; case R.id.avchat_audio_record: listener.toggleRecord(); break; default: break; } } public void closeSession(int exitCode){ if(init){ time.stop(); muteToggle.disable(false); speakerToggle.disable(false); recordToggle.setEnabled(false); refuseTV.setEnabled(false); receiveTV.setEnabled(false); hangup.setEnabled(false); } } /******************************* toggle listener *************************/ @Override public void toggleOn(View v) { onClick(v); } @Override public void toggleOff(View v) { onClick(v); } @Override public void toggleDisable(View v) { } }