|
@@ -0,0 +1,383 @@
|
|
|
+package com.wdkl.ncs.android.component.nursehome.activity;
|
|
|
+
|
|
|
+import android.content.DialogInterface;
|
|
|
+import android.graphics.Color;
|
|
|
+import android.os.Bundle;
|
|
|
+import android.os.SystemClock;
|
|
|
+import android.support.v7.app.AlertDialog;
|
|
|
+import android.util.Log;
|
|
|
+import android.view.View;
|
|
|
+import android.view.WindowManager;
|
|
|
+import android.widget.Chronometer;
|
|
|
+import android.widget.ImageView;
|
|
|
+import android.widget.TextView;
|
|
|
+
|
|
|
+import com.google.gson.Gson;
|
|
|
+import com.starrtc.demo.database.CoreDB;
|
|
|
+import com.starrtc.demo.database.HistoryBean;
|
|
|
+import com.starrtc.demo.demo.BaseActivity;
|
|
|
+import com.starrtc.demo.demo.MLOC;
|
|
|
+import com.starrtc.demo.ui.CircularCoverView;
|
|
|
+import com.starrtc.demo.utils.AEvent;
|
|
|
+import com.starrtc.demo.utils.ColorUtils;
|
|
|
+import com.starrtc.demo.utils.DensityUtils;
|
|
|
+import com.starrtc.starrtcsdk.api.XHClient;
|
|
|
+import com.starrtc.starrtcsdk.api.XHConstants;
|
|
|
+import com.starrtc.starrtcsdk.api.XHVoipManager;
|
|
|
+import com.starrtc.starrtcsdk.apiInterface.IXHResultCallback;
|
|
|
+import com.starrtc.starrtcsdk.core.audio.StarRTCAudioManager;
|
|
|
+import com.starrtc.starrtcsdk.core.pusher.XHCameraRecorder;
|
|
|
+import com.wdkl.ncs.android.component.nursehome.R;
|
|
|
+import com.wdkl.ncs.android.component.nursehome.common.Constants;
|
|
|
+import com.wdkl.ncs.android.component.nursehome.fragment.FramePartFragment;
|
|
|
+import com.wdkl.ncs.android.middleware.model.vo.InteractionVO;
|
|
|
+import com.wdkl.ncs.android.middleware.tcp.TcpClient;
|
|
|
+import com.wdkl.ncs.android.middleware.tcp.channel.DeviceChannel;
|
|
|
+import com.wdkl.ncs.android.middleware.tcp.channel.VoiceUtil;
|
|
|
+import com.wdkl.ncs.android.middleware.tcp.dto.TcpModel;
|
|
|
+import com.wdkl.ncs.android.middleware.tcp.enums.TcpAction;
|
|
|
+import com.wdkl.ncs.android.middleware.tcp.enums.TcpType;
|
|
|
+
|
|
|
+import java.text.SimpleDateFormat;
|
|
|
+import java.util.Set;
|
|
|
+
|
|
|
+public class RTCVoipAudioActivity extends BaseActivity implements View.OnClickListener {
|
|
|
+ private String TAG = RTCVoipAudioActivity.class.getSimpleName();
|
|
|
+
|
|
|
+ private XHVoipManager voipManager;
|
|
|
+ private Chronometer timer;
|
|
|
+
|
|
|
+ private TextView bao_mother_name_tv, bao_mother_age_tv;
|
|
|
+
|
|
|
+ public static String ACTION = "ACTION";
|
|
|
+ public static String RING = "RING";
|
|
|
+ public static String CALLING = "CALLING";
|
|
|
+ private String action;
|
|
|
+ private String targetId;
|
|
|
+ private TextView voice_time_tv;
|
|
|
+
|
|
|
+ private StarRTCAudioManager starRTCAudioManager;
|
|
|
+
|
|
|
+ public InteractionVO interactionVO = new InteractionVO();
|
|
|
+ public TcpModel tcpModel = new TcpModel();
|
|
|
+
|
|
|
+ public static RTCVoipAudioActivity rtcVoipAudioActivity;
|
|
|
+
|
|
|
+ @Override
|
|
|
+ protected void onCreate(Bundle savedInstanceState) {
|
|
|
+ super.onCreate(savedInstanceState);
|
|
|
+ getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
|
|
|
+ getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
|
|
|
+ WindowManager.LayoutParams.FLAG_FULLSCREEN);
|
|
|
+ setContentView(R.layout.window_make_a_voice_call);
|
|
|
+ setFinishOnTouchOutside(false);
|
|
|
+ rtcVoipAudioActivity = this;
|
|
|
+ //todo 设置为通话状态 有其他用户输入时 DeviceChannel设置返回通话中
|
|
|
+ DeviceChannel.calling = true;
|
|
|
+
|
|
|
+ starRTCAudioManager = StarRTCAudioManager.create(this.getApplicationContext());
|
|
|
+ starRTCAudioManager.start(new StarRTCAudioManager.AudioManagerEvents() {
|
|
|
+ @Override
|
|
|
+ public void onAudioDeviceChanged(StarRTCAudioManager.AudioDevice selectedAudioDevice, Set availableAudioDevices) {
|
|
|
+ MLOC.d("onAudioDeviceChanged ", selectedAudioDevice.name());
|
|
|
+ }
|
|
|
+ });
|
|
|
+
|
|
|
+ voipManager = XHClient.getInstance().getVoipManager();
|
|
|
+ voipManager.setRtcMediaType(XHConstants.XHRtcMediaTypeEnum.STAR_RTC_MEDIA_TYPE_AUDIO_ONLY);
|
|
|
+ voipManager.setRecorder(new XHCameraRecorder());
|
|
|
+ addListener();
|
|
|
+
|
|
|
+ targetId = getIntent().getStringExtra("targetId");
|
|
|
+ Log.e("RTCVoipAudioActivity", "SIP账号" + targetId);
|
|
|
+ tcpModel = (TcpModel) getIntent().getSerializableExtra("TcpModel");
|
|
|
+// interactionVO = (InteractionVO) getIntent().getSerializableExtra("interactionVO");
|
|
|
+ action = getIntent().getStringExtra(ACTION);
|
|
|
+ timer = (Chronometer) findViewById(R.id.voice_time_tv);
|
|
|
+
|
|
|
+ bao_mother_name_tv = (TextView) findViewById(R.id.bao_mother_name_tv);
|
|
|
+ bao_mother_age_tv = findViewById(R.id.bao_mother_age_tv);
|
|
|
+ bao_mother_age_tv.setVisibility(View.GONE);
|
|
|
+
|
|
|
+// ((TextView)findViewById(com.starrtc.demo.R.id.targetid_text)).setText(targetId);
|
|
|
+// ((ImageView)findViewById(com.starrtc.demo.R.id.head_img)).setImageResource(MLOC.getHeadImage(RTCVoipAudioActivity.this,targetId));
|
|
|
+// findViewById(com.starrtc.demo.R.id.head_bg).setBackgroundColor(ColorUtils.getColor(RTCVoipAudioActivity.this,targetId));
|
|
|
+// ((CircularCoverView)findViewById(com.starrtc.demo.R.id.head_cover)).setCoverColor(Color.parseColor("#000000"));
|
|
|
+// int cint = DensityUtils.dip2px(RTCVoipAudioActivity.this,45);
|
|
|
+// ((CircularCoverView)findViewById(com.starrtc.demo.R.id.head_cover)).setRadians(cint, cint, cint, cint,0);
|
|
|
+
|
|
|
+ findViewById(R.id.voice_hang_up_imagev).setOnClickListener(this);
|
|
|
+// voice_time_tv = findViewById(R.id.voice_time_tv);
|
|
|
+// voice_time_tv.setVisibility(View.GONE);
|
|
|
+
|
|
|
+ if (tcpModel.getType() == TcpType.VOICE) {
|
|
|
+ if(tcpModel.getAction() == TcpAction.VoiceAction.CALL) {
|
|
|
+ InteractionVO interactionVO = new Gson().fromJson(tcpModel.getData().toString(), InteractionVO.class);
|
|
|
+ bao_mother_name_tv.setText(interactionVO.getFromMemberName());
|
|
|
+ }else if(tcpModel.getAction() == TcpAction.VoiceAction.SUCCESS){
|
|
|
+ InteractionVO interactionVO = (InteractionVO) tcpModel.getData();
|
|
|
+ bao_mother_name_tv.setText(interactionVO.getToMemberName());
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ if (action.equals(CALLING)) {
|
|
|
+ showCallingView();
|
|
|
+ MLOC.d("newVoip", "call");
|
|
|
+ voipManager.audioCall(this, targetId, new IXHResultCallback() {
|
|
|
+ @Override
|
|
|
+ public void success(Object data) {
|
|
|
+ MLOC.d("newVoip", "call success");
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public void failed(String errMsg) {
|
|
|
+ MLOC.d("newVoip", "call failed");
|
|
|
+ stopAndFinish();
|
|
|
+ }
|
|
|
+ });
|
|
|
+ } else if (action.equals(RING)) {
|
|
|
+ MLOC.d("newVoip", "onPickup");
|
|
|
+ onPickup();
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 直接呼叫对方
|
|
|
+ */
|
|
|
+ public void audioCall() {
|
|
|
+ showCallingView();
|
|
|
+ MLOC.d("newVoip", "call");
|
|
|
+ voipManager.audioCall(this, targetId, new IXHResultCallback() {
|
|
|
+ @Override
|
|
|
+ public void success(Object data) {
|
|
|
+ MLOC.d("newVoip", "call success");
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public void failed(String errMsg) {
|
|
|
+ MLOC.d("newVoip", "call failed");
|
|
|
+ stopAndFinish();
|
|
|
+ }
|
|
|
+ });
|
|
|
+
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ private void setupView() {
|
|
|
+ voipManager.setupView(null, null, new IXHResultCallback() {
|
|
|
+ @Override
|
|
|
+ public void success(Object data) {
|
|
|
+ MLOC.d("newVoip", "setupView success");
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public void failed(String errMsg) {
|
|
|
+ MLOC.d("newVoip", "setupView failed");
|
|
|
+ stopAndFinish();
|
|
|
+ }
|
|
|
+ });
|
|
|
+ }
|
|
|
+
|
|
|
+ public void addListener() {
|
|
|
+ AEvent.addListener(AEvent.AEVENT_VOIP_INIT_COMPLETE, this);
|
|
|
+ AEvent.addListener(AEvent.AEVENT_VOIP_REV_BUSY, this);
|
|
|
+ AEvent.addListener(AEvent.AEVENT_VOIP_REV_REFUSED, this);
|
|
|
+ AEvent.addListener(AEvent.AEVENT_VOIP_REV_HANGUP, this);
|
|
|
+ AEvent.addListener(AEvent.AEVENT_VOIP_REV_CONNECT, this);
|
|
|
+ AEvent.addListener(AEvent.AEVENT_VOIP_REV_ERROR, this);
|
|
|
+ }
|
|
|
+
|
|
|
+ public void removeListener() {
|
|
|
+ MLOC.canPickupVoip = true;
|
|
|
+ AEvent.removeListener(AEvent.AEVENT_VOIP_INIT_COMPLETE, this);
|
|
|
+ AEvent.removeListener(AEvent.AEVENT_VOIP_REV_BUSY, this);
|
|
|
+ AEvent.removeListener(AEvent.AEVENT_VOIP_REV_REFUSED, this);
|
|
|
+ AEvent.removeListener(AEvent.AEVENT_VOIP_REV_HANGUP, this);
|
|
|
+ AEvent.removeListener(AEvent.AEVENT_VOIP_REV_CONNECT, this);
|
|
|
+ AEvent.removeListener(AEvent.AEVENT_VOIP_REV_ERROR, this);
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public void onResume() {
|
|
|
+ super.onResume();
|
|
|
+ MLOC.canPickupVoip = false;
|
|
|
+ HistoryBean historyBean = new HistoryBean();
|
|
|
+ historyBean.setType(CoreDB.HISTORY_TYPE_VOIP);
|
|
|
+ historyBean.setLastTime(new SimpleDateFormat("MM-dd HH:mm").format(new java.util.Date()));
|
|
|
+ historyBean.setConversationId(targetId);
|
|
|
+ historyBean.setNewMsgCount(1);
|
|
|
+ MLOC.addHistory(historyBean, true);
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public void onPause() {
|
|
|
+ super.onPause();
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public void onRestart() {
|
|
|
+ super.onRestart();
|
|
|
+ addListener();
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public void onDestroy() {
|
|
|
+ removeListener();
|
|
|
+ //todo 状态设置为未在通话中
|
|
|
+ DeviceChannel.calling = false;
|
|
|
+ super.onDestroy();
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public void onBackPressed() {
|
|
|
+ new AlertDialog.Builder(RTCVoipAudioActivity.this).setCancelable(true)
|
|
|
+ .setTitle("是否挂断?")
|
|
|
+ .setNegativeButton("取消", new DialogInterface.OnClickListener() {
|
|
|
+ @Override
|
|
|
+ public void onClick(DialogInterface arg0, int arg1) {
|
|
|
+
|
|
|
+ }
|
|
|
+ }).setPositiveButton("确定", new DialogInterface.OnClickListener() {
|
|
|
+ @Override
|
|
|
+ public void onClick(DialogInterface arg0, int arg1) {
|
|
|
+ timer.stop();
|
|
|
+ voipManager.hangup(new IXHResultCallback() {
|
|
|
+ @Override
|
|
|
+ public void success(Object data) {
|
|
|
+ stopAndFinish();
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public void failed(final String errMsg) {
|
|
|
+ MLOC.d("", "AEVENT_VOIP_ON_STOP errMsg:" + errMsg);
|
|
|
+ MLOC.showMsg(RTCVoipAudioActivity.this, errMsg);
|
|
|
+ }
|
|
|
+ });
|
|
|
+ }
|
|
|
+ }
|
|
|
+ ).show();
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public void dispatchEvent(String aEventID, boolean success, final Object eventObj) {
|
|
|
+ super.dispatchEvent(aEventID, success, eventObj);
|
|
|
+ switch (aEventID) {
|
|
|
+ case AEvent.AEVENT_VOIP_REV_BUSY:
|
|
|
+ MLOC.d("", "对方线路忙");
|
|
|
+ MLOC.showMsg(RTCVoipAudioActivity.this, "对方线路忙");
|
|
|
+ stopAndFinish();
|
|
|
+ break;
|
|
|
+ case AEvent.AEVENT_VOIP_REV_REFUSED:
|
|
|
+ MLOC.d("", "对方拒绝通话");
|
|
|
+ MLOC.showMsg(RTCVoipAudioActivity.this, "对方拒绝通话");
|
|
|
+ stopAndFinish();
|
|
|
+ break;
|
|
|
+ case AEvent.AEVENT_VOIP_REV_HANGUP:
|
|
|
+ MLOC.d("", "对方已挂断");
|
|
|
+ MLOC.showMsg(RTCVoipAudioActivity.this, "对方已挂断");
|
|
|
+ timer.stop();
|
|
|
+ stopAndFinish();
|
|
|
+ break;
|
|
|
+ case AEvent.AEVENT_VOIP_REV_CONNECT:
|
|
|
+ MLOC.d("", "对方允许通话");
|
|
|
+ showTalkingView();
|
|
|
+ break;
|
|
|
+ case AEvent.AEVENT_VOIP_REV_ERROR:
|
|
|
+ MLOC.d("", (String) eventObj);
|
|
|
+ stopAndFinish();
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ private void showCallingView() {
|
|
|
+ MLOC.d("", "showCallingView");
|
|
|
+// findViewById(com.starrtc.demo.R.id.calling_txt).setVisibility(View.VISIBLE);
|
|
|
+// findViewById(R.id.voice_time_tv).setVisibility(View.INVISIBLE);
|
|
|
+ timer.setVisibility(View.VISIBLE);
|
|
|
+ }
|
|
|
+
|
|
|
+ private void showTalkingView() {
|
|
|
+ MLOC.d("", "showTalkingView");
|
|
|
+// findViewById(com.starrtc.demo.R.id.calling_txt).setVisibility(View.INVISIBLE);
|
|
|
+ findViewById(R.id.voice_time_tv).setVisibility(View.VISIBLE);
|
|
|
+ timer.setBase(SystemClock.elapsedRealtime());
|
|
|
+ timer.start();
|
|
|
+ setupView();
|
|
|
+ }
|
|
|
+
|
|
|
+ private void onPickup() {
|
|
|
+ voipManager.accept(this, targetId, new IXHResultCallback() {
|
|
|
+ @Override
|
|
|
+ public void success(Object data) {
|
|
|
+ MLOC.d("newVoip", "onPickup OK ");
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public void failed(String errMsg) {
|
|
|
+ MLOC.d("newVoip", "onPickup failed ");
|
|
|
+ stopAndFinish();
|
|
|
+ }
|
|
|
+ });
|
|
|
+ showTalkingView();
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public void onClick(View v) {
|
|
|
+ if (v.getId() == R.id.voice_hang_up_imagev) {
|
|
|
+ InteractionVO interactionVO = null;
|
|
|
+ if(tcpModel.getData().getClass().getName().equals(String.class.getName())) {
|
|
|
+ interactionVO = new Gson().fromJson(tcpModel.getData().toString(),InteractionVO.class);
|
|
|
+ }else{
|
|
|
+ interactionVO = (InteractionVO) tcpModel.getData();
|
|
|
+ }
|
|
|
+
|
|
|
+ Log.e(TAG, "tcpModel" + interactionVO.getId());
|
|
|
+ Log.e(TAG, "tcpModel" + tcpModel.toJson());
|
|
|
+// InteractionVO interactionVO =null;
|
|
|
+// if(tcpModel.getData() != null){
|
|
|
+// interactionVO = new Gson().fromJson(tcpModel.getData().toString(), InteractionVO.class);
|
|
|
+// }
|
|
|
+ //todo 给服务器发送挂断 tcp
|
|
|
+ if (interactionVO != null) {
|
|
|
+ if (tcpModel.getType() == TcpType.VOICE) {
|
|
|
+ if (tcpModel.getAction() == TcpAction.VoiceAction.SUCCESS) {
|
|
|
+ TcpModel voiceUtilTcpModel = VoiceUtil.voiceHandoff(Integer.parseInt(Constants.Companion.getIds()), tcpModel.getToId()
|
|
|
+ , interactionVO.getId());
|
|
|
+ TcpClient.getInstance().sendMsg(voiceUtilTcpModel.toJson());
|
|
|
+ } else if(tcpModel.getAction() == TcpAction.VoiceAction.CALL){
|
|
|
+ TcpModel voiceUtilTcpModel = VoiceUtil.voiceHandoff(Integer.parseInt(Constants.Companion.getIds()), tcpModel.getFromId()
|
|
|
+ , interactionVO.getId());
|
|
|
+ TcpClient.getInstance().sendMsg(voiceUtilTcpModel.toJson());
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ voipManager.hangup(new IXHResultCallback() {
|
|
|
+ @Override
|
|
|
+ public void success(Object data) {
|
|
|
+ stopAndFinish();
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public void failed(String errMsg) {
|
|
|
+ stopAndFinish();
|
|
|
+ }
|
|
|
+ });
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ private void stopAndFinish() {
|
|
|
+ if (starRTCAudioManager != null) {
|
|
|
+ starRTCAudioManager.stop();
|
|
|
+ }
|
|
|
+ RTCVoipAudioActivity.this.finish();
|
|
|
+ }
|
|
|
+ public void Finish() {
|
|
|
+ if (starRTCAudioManager != null) {
|
|
|
+ starRTCAudioManager.stop();
|
|
|
+ }
|
|
|
+ RTCVoipAudioActivity.this.finish();
|
|
|
+ }
|
|
|
+}
|