Browse Source

增加呼叫转移,优化界面显示,修复分机挂断没有退出的问题

weizhengliang 3 years ago
parent
commit
8819c2bacf

+ 60 - 4
home/src/main/code/com/wdkl/ncs/android/component/home/activity/NewCallListActivity.kt

@@ -1,5 +1,6 @@
 package com.wdkl.ncs.android.component.home.activity
 
+import android.annotation.SuppressLint
 import android.content.Intent
 import android.os.Bundle
 import android.support.v7.widget.RecyclerView
@@ -15,7 +16,10 @@ import com.scwang.smartrefresh.layout.SmartRefreshLayout
 import com.wdkl.ncs.android.component.home.R
 import com.wdkl.ncs.android.component.home.adapter.NewCallItemAdapter
 import com.wdkl.ncs.android.component.home.service.WdKeepAliveService
+import com.wdkl.ncs.android.component.home.settingconfig.SettingConfig
 import com.wdkl.ncs.android.component.home.ui.CallSingleActivity
+import com.wdkl.ncs.android.component.home.ui.FragmentAudio
+import com.wdkl.ncs.android.component.home.ui.SingleCallFragment
 import com.wdkl.ncs.android.component.home.util.HandleTcpConnect
 import com.wdkl.ncs.android.component.home.util.RingPlayHelper
 import com.wdkl.ncs.android.component.home.util.SpeechUtil
@@ -35,7 +39,7 @@ import org.greenrobot.eventbus.Subscribe
 import org.greenrobot.eventbus.ThreadMode
 
 class NewCallListActivity : BaseToolActivity(), NewCallItemAdapter.CallClickListener {
-    var TAG = WatchContactsActivity::class.java.getSimpleName()
+    var TAG = NewCallListActivity::class.java.getSimpleName()
 
     private val adapter = NewCallItemAdapter(ArrayList(),this)
     private lateinit var virtualLayoutManager: VirtualLayoutManager
@@ -45,6 +49,8 @@ class NewCallListActivity : BaseToolActivity(), NewCallItemAdapter.CallClickList
     private lateinit var refreshView: SmartRefreshLayout
     private lateinit var emptyView: TextView
 
+    private var transSeconds = 15
+
     override fun onCreate(savedInstanceState: Bundle?) {
         super.onCreate(savedInstanceState)
 
@@ -54,6 +60,8 @@ class NewCallListActivity : BaseToolActivity(), NewCallItemAdapter.CallClickList
             EventBus.getDefault().register(this)
         }
 
+        transSeconds = SettingConfig.getCountdownTime(activity)
+
         recyclerView = findViewById(R.id.rv_call_list)
         refreshView = findViewById(R.id.srl_call_list)
         emptyView = findViewById(R.id.tv_empty_call)
@@ -106,7 +114,8 @@ class NewCallListActivity : BaseToolActivity(), NewCallItemAdapter.CallClickList
             adapter.setOnItemClickListener { data, position ->
                 SpeechUtil.getInstance().stopSpeak()
                 val interactionVO = Gson().fromJson(data.data.toString(), InteractionVO::class.java)
-                val callTcp = VoiceUtil.voiceHandoff(Constants.deviceId, interactionVO.fromDeviceId, interactionVO.id)
+                //val callTcp = VoiceUtil.voiceHandoff(Constants.deviceId, interactionVO.fromDeviceId, interactionVO.id)
+                val callTcp = VoiceUtil.voiceReject(Constants.deviceId, interactionVO.fromDeviceId, interactionVO.id)
                 NettyClient.instance.sendMsg(callTcp.toJson())
                     .subscribe { success: Boolean ->
                         if (success) {
@@ -130,6 +139,52 @@ class NewCallListActivity : BaseToolActivity(), NewCallItemAdapter.CallClickList
         }
 
         WdKeepAliveService.mNewCallListActive = true
+
+        //启动线程处理呼叫转移
+        if (true) {
+            startLoopTransfer()
+        }
+    }
+
+    @SuppressLint("CheckResult")
+    private fun startLoopTransfer() {
+        Thread {
+            while (Constants.newCallList.size > 0) {
+                val curTime = System.currentTimeMillis()
+                var interactionVO: InteractionVO? = null
+                var removeCall = false
+                for (item in Constants.newCallList) {
+                    interactionVO = Gson().fromJson(item.data.toString(), InteractionVO::class.java)
+                    if (curTime - interactionVO.createDate*1000L >= transSeconds*1000L) {
+                        val voiceTransferTcpModel = VoiceUtil.voiceTransferToHost(Constants.deviceId, interactionVO.fromDeviceId, interactionVO)
+                        NettyClient.instance.sendMsg(voiceTransferTcpModel.toJson())
+                            .subscribe {
+                                if (it) {
+                                    //Log.d(TAG, "TCP.发送消息完成")
+                                } else {
+                                    //Log.e(TAG, "TCP.发送消息失败")
+                                    HandleTcpConnect.instance.tcpReConnectWithMsgShow()
+                                }
+                            }
+
+                        removeCall = true
+                        break
+                    }
+                }
+
+                if (removeCall) {
+                    runOnUiThread {
+                        removeCall(interactionVO!!)
+                    }
+                }
+
+                try {
+                    Thread.sleep(5000)
+                } catch (ex: Exception) {
+                    //ex.printStackTrace()
+                }
+            }
+        }.start()
     }
 
     override fun onResume() {
@@ -140,6 +195,7 @@ class NewCallListActivity : BaseToolActivity(), NewCallItemAdapter.CallClickList
     override fun onDestroy() {
         super.onDestroy()
         RingPlayHelper.stopRingTone()
+        SpeechUtil.getInstance().stopSpeak()
         if (EventBus.getDefault().isRegistered(this)) {
             EventBus.getDefault().unregister(this)
         }
@@ -204,8 +260,8 @@ class NewCallListActivity : BaseToolActivity(), NewCallItemAdapter.CallClickList
             updateCallList()
         } else if (messageEvent.tag == Constants.EVENT_NEW_TCP) {
             val tcpModel = messageEvent.getMessage() as TcpModel
-            if (tcpModel.getAction() === TcpAction.VoiceAction.CANCEL) {
-                //对方取消呼叫
+            if (tcpModel.getAction() === TcpAction.VoiceAction.CANCEL || tcpModel.action == TcpAction.VoiceAction.VOICE_OFF) {
+                //对方取消呼叫或者呼叫已被其他主机处理(接听或拒绝)
                 val interactionVO = Gson().fromJson(tcpModel.data.toString(), InteractionVO::class.java)
                 removeCall(interactionVO)
             }

+ 32 - 21
home/src/main/code/com/wdkl/ncs/android/component/home/activity/WatchHome2Activity.kt

@@ -329,6 +329,7 @@ class WatchHome2Activity : BaseActivity<WatchHomeActivityPresenter, WatchActivit
         Constants.partId = data.partId
         Constants.deviceId = data.id
         Constants.sipId = data.sipId
+        Constants.deviceType = data.deviceType
 
         loadingDialog.dismiss()
         watch_activity_register_layout.visibility = View.GONE
@@ -369,18 +370,24 @@ class WatchHome2Activity : BaseActivity<WatchHomeActivityPresenter, WatchActivit
         //onTcpConnectSuccess()
 
         if (Strings.isNullOrEmpty(Constants.userName)) {
-            watch_name_tv.text = "重载"
-            watch_name_tv.setTextColor(Color.BLACK)
-            watch_name_tv.textSize = 13f
-            watch_name_tv.setBackgroundResource(R.drawable.javashop_btn_balck_line_bg)
-            watch_name_tv.setOnClickListener {
-                loadingDialog.show()
-                presenter.getDeviceVO(Constants.imei)
-                return@setOnClickListener
-            }
+            if (Constants.deviceType == 1) {
+                watch_name_tv.visibility = View.GONE
+                watch_role_name_tv.text = "腕表"
+                watch_role_name_tv.textSize = 12f
+            } else {
+                watch_name_tv.text = "重载"
+                watch_name_tv.setTextColor(Color.BLACK)
+                watch_name_tv.textSize = 13f
+                watch_name_tv.setBackgroundResource(R.drawable.javashop_btn_balck_line_bg)
+                watch_name_tv.setOnClickListener {
+                    loadingDialog.show()
+                    presenter.getDeviceVO(Constants.imei)
+                    return@setOnClickListener
+                }
 
-            watch_role_name_tv.text = "请使用PC设置使用人"
-            watch_role_name_tv.textSize = 12f
+                watch_role_name_tv.text = "请使用PC设置使用人"
+                watch_role_name_tv.textSize = 12f
+            }
         } else {
             watch_name_tv.text = Constants.userName
             if (Constants.userName != null) {
@@ -448,6 +455,8 @@ class WatchHome2Activity : BaseActivity<WatchHomeActivityPresenter, WatchActivit
                     SettingConfig.setCountdownTime(application, partSettingDO.transferDuration)
                 } else if (Constants.userRoleName!!.contains("护士组长")) {
                     SettingConfig.setCountdownTime(application, partSettingDO.transferDurationLeader)
+                } else {
+                    SettingConfig.setCountdownTime(application, partSettingDO.transferDuration)
                 }
             }
         }
@@ -511,13 +520,13 @@ class WatchHome2Activity : BaseActivity<WatchHomeActivityPresenter, WatchActivit
         state_linlyout.setOnClickListener(this)
         other_linyout.setOnClickListener(this)
         channel_im_layout.setOnClickListener(this)
-        tv_register_ok.setOnClickListener({
+        tv_register_ok.setOnClickListener {
             Log.d(TAG, "注册完成")
             initTcp()
 
             //presenter.getDeviceVO(Constants.imei)
             countDownTimer.start()
-        })
+        }
     }
 
     override fun enableHeadsetVoiceMsg(): Boolean {
@@ -619,14 +628,16 @@ class WatchHome2Activity : BaseActivity<WatchHomeActivityPresenter, WatchActivit
                 startActivity(intent)
             }
             R.id.user_name_linlyout -> {
-                if (Constants.userName == null) {
-                    var intent = Intent(this, TakeoverActivity().javaClass)
-                    startActivity(intent)
-                } else {
-                    var intent = Intent(this, WatchCallRecordsActivity::class.java)
-                    intent.putExtra("action", "UNREAD")
-                    intent.putExtra("customer_id", "")
-                    startActivity(intent)
+                if (Constants.deviceType != 1) {
+                    if (Constants.userName == null) {
+                        var intent = Intent(this, TakeoverActivity().javaClass)
+                        startActivity(intent)
+                    } else {
+                        var intent = Intent(this, WatchCallRecordsActivity::class.java)
+                        intent.putExtra("action", "UNREAD")
+                        intent.putExtra("customer_id", "")
+                        startActivity(intent)
+                    }
                 }
             }
             R.id.channel_im_layout -> {

+ 5 - 1
home/src/main/code/com/wdkl/ncs/android/component/home/service/WdKeepAliveService.kt

@@ -625,6 +625,8 @@ class WdKeepAliveService : AbsWorkService() {
                                 SettingConfig.setCountdownTime(application, partSettingDO.transferDuration)
                             } else if (Constants.userRoleName!!.contains("护士组长")) {
                                 SettingConfig.setCountdownTime(application, partSettingDO.transferDurationLeader)
+                            } else {
+                                SettingConfig.setCountdownTime(application, partSettingDO.transferDuration)
                             }
                         }
                     }
@@ -912,7 +914,9 @@ class WdKeepAliveService : AbsWorkService() {
                                     else if (Constants.channelId == -1) {
                                         showMessage("请先建立频道")
                                     } else if (!DeviceChannel.calling && Constants.allowVoiceMsg && !TextUtils.isEmpty(Constants.userName)) {
-                                        RecordHelper.getInstance().execRecordVoiceMsg()
+                                        if (Constants.deviceType != 1) {
+                                            RecordHelper.getInstance().execRecordVoiceMsg()
+                                        }
                                     } else {
                                         //在某些特定界面不支持按键留言,如果按键的时候正在留言则停止录音并发送留言
                                         if (RecordHelper.getInstance().isRecording) {

+ 4 - 2
home/src/main/code/com/wdkl/ncs/android/component/home/ui/CallSingleActivity.java

@@ -73,7 +73,8 @@ public class CallSingleActivity extends AppCompatActivity {
     private boolean isOutgoing;
     private BigInteger roomId;
     private Room room;
-    private BigInteger localUserId = BigInteger.valueOf(Constants.Companion.getMemberId());
+    //private BigInteger localUserId = BigInteger.valueOf(Constants.Companion.getMemberId());
+    private BigInteger localUserId = BigInteger.valueOf(Integer.parseInt(Constants.Companion.getSipId()));
 
     boolean isAudioOnly = true;
     String showName;
@@ -376,7 +377,8 @@ public class CallSingleActivity extends AppCompatActivity {
                 if (interactionVO == null){
                     voiceUtilTcpModel = VoiceUtil.voiceCancel(Constants.Companion.getDeviceId(),recTcpModel.getToId());
                 } else {
-                    voiceUtilTcpModel = VoiceUtil.voiceHandoff(Constants.Companion.getDeviceId(), toId, interactionVO.getId());
+                    //voiceUtilTcpModel = VoiceUtil.voiceHandoff(Constants.Companion.getDeviceId(), toId, interactionVO.getId());
+                    voiceUtilTcpModel = VoiceUtil.voiceReject(Constants.Companion.getDeviceId(), toId, interactionVO.getId());
                 }
                 NettyClient.Companion.getInstance().sendMsg(voiceUtilTcpModel.toJson()).subscribe(it-> {
                     if (it) {

+ 2 - 2
home/src/main/code/com/wdkl/ncs/android/component/home/ui/FragmentAudio.java

@@ -84,10 +84,10 @@ public class FragmentAudio extends SingleCallFragment implements View.OnClickLis
         }
         transHandler = new TransHandler();
         //是来电,且是客户来电进入延时转接
-        if (!isOutgoing && !callSingleActivity.ringUp && interactionVO != null && interactionVO.getFromClerkId()==null) {
+        /*if (!isOutgoing && !callSingleActivity.ringUp && interactionVO != null && interactionVO.getFromClerkId()==null) {
             int transSeconds = SettingConfig.getCountdownTime(this.getContext());
             transHandler.sendEmptyMessageDelayed(TRANS, transSeconds * 1000);
-        }
+        }*/
 
         // 如果已经接通
         if (callSingleActivity.janusClient != null && callSingleActivity.janusClient.getCallState() == EnumType.CallState.Connected) {

+ 2 - 3
home/src/main/code/com/wdkl/ncs/android/component/home/ui/SingleCallFragment.java

@@ -427,7 +427,7 @@ public abstract class SingleCallFragment extends Fragment {
 //                }
 //            });
 
-            //handler.sendEmptyMessageDelayed(FINISH_CURRENT, 1);
+            handler.sendEmptyMessageDelayed(FINISH_CURRENT, 100);
         } else if (code == JanusClient.CALLBACK_ROOM_ERROR) {
             runOnUiThread(new Runnable() {
                 @Override
@@ -488,8 +488,7 @@ public abstract class SingleCallFragment extends Fragment {
             });
 
             handler.sendEmptyMessageDelayed(FINISH_CURRENT, 100);
-        }
-        else if (code == JanusClient.CALLBACK_SLOW_LINK){
+        } else if (code == JanusClient.CALLBACK_SLOW_LINK){
             runOnUiThread(new Runnable() {
                 @Override
                 public void run() {

+ 1 - 1
home/src/main/res/layout/watch_activity_home2.xml

@@ -14,7 +14,7 @@
             android:layout_width="match_parent"
             android:layout_height="match_parent"
             android:orientation="vertical"
-            android:visibility="visible">
+            android:visibility="gone">
 
             <LinearLayout
                 android:layout_width="match_parent"

+ 2 - 1
middleware/src/main/code/com/wdkl/ncs/android/middleware/common/Constants.kt

@@ -13,6 +13,7 @@ class Constants {
         var frameId: String =""//医院结构ID
         var ethIp: String? ="" //当前设备的IP
         var deviceId: Int = 0//当前设备的ID
+        var deviceType: Int = 0 //设备类型
         var sipIp: String? =""//sipip
         var sipId: String? =""//sipid
         var sipPassword: String? =""//sip密码
@@ -44,7 +45,7 @@ class Constants {
         //来电呼叫列表
         var newCallList = ArrayList<TcpModel>()
         //是否支持语音通话
-        val supportCall = false
+        val supportCall = true
 
         //手机通话方式: 默认网络
         var phoneType = CommunicationEnum.NET_WORK.value()

+ 2 - 1
middleware/src/main/code/com/wdkl/ncs/android/middleware/tcp/channel/DeviceChannel.java

@@ -75,7 +75,8 @@ public class DeviceChannel {
                         || (tcpModel.getAction() == TcpAction.VoiceAction.CALLING) //我方呼出,对方通话中
                         || (tcpModel.getAction() == TcpAction.VoiceAction.HANDOFF)
                         || (tcpModel.getAction() == TcpAction.VoiceAction.FAILED) //我方呼出,对方不在线,设备离线或其它错误
-                        || (tcpModel.getAction() == TcpAction.VoiceAction.CANCEL)) { //对方取消
+                        || (tcpModel.getAction() == TcpAction.VoiceAction.CANCEL) //对方取消
+                        || (tcpModel.getAction()== TcpAction.VoiceAction.VOICE_OFF)) { //呼叫被处理
                     if (tcpModel.getAction() == TcpAction.VoiceAction.CALLING){
                         final TcpModel tm = tcpModel;
                         new Thread(new Runnable() {

+ 12 - 0
middleware/src/main/code/com/wdkl/ncs/android/middleware/tcp/channel/VoiceUtil.java

@@ -110,4 +110,16 @@ public class VoiceUtil {
         tcpModel.setData(map);
         return tcpModel;
     }
+
+    public static TcpModel voiceTransferToHost(Integer fromId, Integer deviceId, Object interactionVO){
+        TcpModel tcpModel = new TcpModel();
+        tcpModel.setType(TcpType.VOICE);
+        tcpModel.setAction(TcpAction.VoiceAction.TRANSFER);
+        tcpModel.setFromId(fromId);
+        Map map = new HashMap<String,String>();
+        map.put("deviceId",deviceId);
+        map.put("interactionVo",interactionVO);
+        tcpModel.setData(map);
+        return tcpModel;
+    }
 }

+ 162 - 26
middleware/src/main/code/com/wdkl/ncs/android/middleware/tcp/enums/TcpAction.java

@@ -40,20 +40,18 @@ public interface TcpAction {
         }
     }
 
-    enum VoiceAction implements TcpAction {
+    enum PhoneAction implements TcpAction {
         CALL("呼叫"),
         ACCEPT("接受呼叫"),
         REJECT("拒绝"),
         CALLING("通话中"),
-        TRANSFER("转接"),
         HANDOFF("挂断"),
-        CANCEL("取消"),
-        SUCCESS("呼叫成功"),
-        FAILED("呼叫失败");
+        DATA("数据传输"),
+        CANCEL("取消");
 
 
         private String description;
-        VoiceAction(String description){
+        PhoneAction(String description){
             this.description = description;
         }
 
@@ -65,30 +63,45 @@ public interface TcpAction {
             return this.name();
         }
 
-        private final static Map<String , VoiceAction> ENUM_MAP = new HashMap<String, VoiceAction>();
+        private final static Map<String , PhoneAction> ENUM_MAP = new HashMap<String, PhoneAction>();
         static {
-            for(VoiceAction v : values()) {
+            for(PhoneAction v : values()) {
                 ENUM_MAP.put(v.toString() , v);
             }
         }
-        public static VoiceAction fromString(String v) {
-            VoiceAction userOptionEnum = ENUM_MAP.get(v);
+        public static PhoneAction fromString(String v) {
+            PhoneAction userOptionEnum = ENUM_MAP.get(v);
             return userOptionEnum == null ? CALL :userOptionEnum;
         }
     }
 
-    enum PhoneAction implements TcpAction {
+    enum VoiceAction implements TcpAction {
         CALL("呼叫"),
         ACCEPT("接受呼叫"),
+        ACCEPTED("已接听"),
         REJECT("拒绝"),
         CALLING("通话中"),
+        TRANSFER("转接"),
         HANDOFF("挂断"),
-        DATA("数据传输"),
-        CANCEL("取消");
+        CANCEL("取消"),
+        PCALLING("已经通话中"),
+        VOICE_OFF("通话被接听"),
+        RS485CALL("485界面发起呼叫"),
+        RS485CANCEL("485界面呼叫取消"),
+        RS485CANCEL_BY_DOOR("485门口机取消房间内的呼叫"),
+        RS485HANDOFF("485界面挂断"),
+        RS485ACCEPT("485界面接听"),
+        RS485REJECT("485界面拒绝"),
+        SUCCESS("呼叫成功"),
+        FAILED("呼叫失败"),
+        GAIN_CALL("应答"),
+        GAIN_OK("应答成功"),
+        GAIN_FAIL("应答失败"),
+        GAINED("呼叫被应答");
 
 
         private String description;
-        PhoneAction(String description){
+        VoiceAction(String description){
             this.description = description;
         }
 
@@ -100,21 +113,31 @@ public interface TcpAction {
             return this.name();
         }
 
-        private final static Map<String , PhoneAction> ENUM_MAP = new HashMap<String, PhoneAction>();
+        private final static Map<String , VoiceAction> ENUM_MAP = new HashMap<String, VoiceAction>();
         static {
-            for(PhoneAction v : values()) {
+            for(VoiceAction v : values()) {
                 ENUM_MAP.put(v.toString() , v);
             }
         }
-        public static PhoneAction fromString(String v) {
-            PhoneAction userOptionEnum = ENUM_MAP.get(v);
+        public static VoiceAction fromString(String v) {
+            VoiceAction userOptionEnum = ENUM_MAP.get(v);
             return userOptionEnum == null ? CALL :userOptionEnum;
         }
     }
 
     enum VideoAction implements TcpAction {
-        CALL("呼叫"),
-        CANCEL("取消");
+        CALL("视频通话"),   //正常视频对讲
+        VIDEO_OUT_CALL("我方视频输出"),   //我方视频输出(我方语音,对方可视)
+        VIDEO_IN_CALL("对方视频输出"),    //对方视频输出(我方可视,对方语音)
+        VIDEO_ON("打开视频"),   //打开视频
+        VIDEO_INVITE_JOIN("邀请加入视频"),    //邀请加入视频
+        ACCEPT("接受呼叫"),
+        REJECT("拒绝"),
+        CALLING("通话中"),
+        HANDOFF("挂断"),
+        CANCEL("取消"),
+        SUCCESS("呼叫成功"),
+        FAILED("呼叫失败");
 
         private String description;
         VideoAction(String description){
@@ -144,7 +167,19 @@ public interface TcpAction {
 
     enum SOSAction implements TcpAction {
         CALL("紧急呼叫"),
-        CANCEL("取消");
+        CANCEL("取消"),
+        TRANSFER("转接"),
+        ALARM_TEST("测试报警"),
+        ALARM_INTRUSION("侵入报警"),
+        ALARM_ON_EIGHT_HOURS("八小时无人报警"),
+        ALARM_ON_TWELVE_HOURS("十二小时无人报警"),
+        ALARM_ON_TWENTY_FOUR_HOURS("二十四小时无人报警"),
+        ALARM_DISASSEMBLE("防拆报警"),
+        ALARM_FAULT("故障报警"),
+        ALARM_DOOR_LOCK("门磁报警"),
+        ALARM_SMOKE("烟感报警"),
+        ALARM_GAS("燃气报警"),
+        ALARM_WATER_OVERFLOW("浸水报警");
 
         private String description;
         SOSAction(String description){
@@ -171,11 +206,40 @@ public interface TcpAction {
         }
     }
 
+    enum ReinforceAction implements TcpAction {
+        CALL("增援"),
+        RESPONSED("已响应");
+
+        private String description;
+        ReinforceAction(String description){
+            this.description = description;
+        }
+
+        public String getDescription() {
+            return description;
+        }
+
+        public String getName(){
+            return this.name();
+        }
+
+        private final static Map<String , ReinforceAction> ENUM_MAP = new HashMap<String, ReinforceAction>();
+        static {
+            for(ReinforceAction v : values()) {
+                ENUM_MAP.put(v.toString() , v);
+            }
+        }
+        public static ReinforceAction fromString(String v) {
+            ReinforceAction userOptionEnum = ENUM_MAP.get(v);
+            return userOptionEnum == null ? CALL :userOptionEnum;
+        }
+    }
+
 
     enum IMAction implements TcpAction {
         MSG("语音留言"),
-        RECEIVED("客户端收到确认"),
-        MSG_READ("语音留言已读");
+        MSG_READ("语音留言已读"),
+        RECEIVED("客户端收到确认");
 
         private String description;
         IMAction(String description){
@@ -269,13 +333,11 @@ public interface TcpAction {
 
     enum EventAction implements TcpAction {
         KEY_CLICK("按键事件"),
-        RECEIVED("客户端收到确认"),
         RESPONSE("已响应"),
+        RECEIVED("接收端收到确认"),
         CANCEL("取消"),
         CANCEL_CONFIRM("接收端确认收到取消"),
         COMPLETED("完成");
-
-
         private String description;
         EventAction(String description){
             this.description = description;
@@ -300,6 +362,40 @@ public interface TcpAction {
         }
     }
 
+    enum SideAction implements TcpAction {
+        CALL("呼叫"),
+        ACCEPT("接听"),
+        CANCEL("结束"),
+        SOS_CALL("紧急呼叫"),
+        SOS_CANCEL("取消"),
+        NURSING("护理"),
+        NURSING_END("护理结束");
+        private String description;
+        SideAction(String description){
+            this.description = description;
+        }
+        public String getDescription() {
+            return description;
+        }
+
+        public String getName(){
+            return this.name();
+        }
+
+        private final static Map<String , SideAction> ENUM_MAP = new HashMap<String, SideAction>();
+        static {
+            for(SideAction v : values()) {
+                ENUM_MAP.put(v.toString() , v);
+            }
+        }
+        public static SideAction fromString(String v) {
+            SideAction userOptionEnum = ENUM_MAP.get(v);
+            return userOptionEnum == null ? CALL :userOptionEnum;
+        }
+    }
+
+
+
     enum DataAction implements TcpAction {
         REFRESH("刷新数据"),
         INTERACTION("刷新交互列表");
@@ -379,4 +475,44 @@ public interface TcpAction {
             return userOptionEnum == null ? SYNC :userOptionEnum;
         }
     }
+
+    enum EntraceGuardAction implements TcpAction {
+        STRANGER("陌生访客"),
+        LOCKDOOR("锁门"),
+        UNLOCKDOOR("开门"),
+        ACCEPT("主机接受视频"),//通话空闲时自动接受
+        REJECT("拒绝"), // 通话忙时自动拒接
+        OPENSPEAKER("打开麦克风"),//护士主机打开麦克风,门禁机也打开,双方停止等待音乐,打开后可以通话,默认只有视频界面,没有声音
+        CLOSESPEAKER("关闭麦克风"),//关闭音频
+        SUCCESS("连接主机成功"),
+        HANGUP("挂断"),
+        TIMEOUT("响应超时"),
+        FAILED("连接失败");
+
+
+        private String description;
+
+        EntraceGuardAction(String description) {
+            this.description = description;
+        }
+        public String getDescription() {
+            return description;
+        }
+
+        public String getName(){
+            return this.name();
+        }
+
+        private final static Map<String , EntraceGuardAction> ENUM_MAP = new HashMap<String, EntraceGuardAction>();
+        static {
+            for(EntraceGuardAction v : values()) {
+                ENUM_MAP.put(v.toString() , v);
+            }
+        }
+        public static EntraceGuardAction fromString(String v) {
+            EntraceGuardAction userOptionEnum = ENUM_MAP.get(v);
+            return userOptionEnum;
+        }
+    }
+
 }

+ 6 - 3
middleware/src/main/code/com/wdkl/ncs/android/middleware/tcp/enums/TcpType.java

@@ -8,16 +8,19 @@ import java.util.Map;
  */
 public enum TcpType {
     CALLBACK("TCP反馈"),
-    VOICE("语音"),
     PHONE("普通电话"),
+    VOICE("语音"),
     VIDEO("视频"),
     SOS("紧急呼叫"),
+    REINFORCE("增援"),
     IM("留言"),
-    CHANNELIM("频道对讲留言"),
+    EVENT("事件"),
+    SIDE("边外信息"),
     DEVICE("设备"),
     DATA("数据"),
-    EVENT("事件"),
     BROADCAST("广播"),
+    ENTRACEGUARD("门禁"),
+    CHANNELIM("频道留言"),
     TIME("时间");
 
     private String description;