Pārlūkot izejas kodu

益阳分机版本:增加卸载老的app功能,增加门口机取消分机呼叫功能,增加增援功能

weizhengliang 3 gadi atpakaļ
vecāks
revīzija
54d5e41523

+ 89 - 26
callingbed/src/main/java/com/wdkl/app/ncs/callingbed/activity/CallingbedActivity.kt

@@ -52,6 +52,7 @@ import com.wdkl.ncs.android.middleware.model.vo.BedDeviceInfoVO
 import com.wdkl.ncs.android.middleware.model.vo.CustomerInfoVO
 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.OtherUtil
 import com.wdkl.ncs.android.middleware.tcp.channel.VideoUtil
 import com.wdkl.ncs.android.middleware.tcp.channel.VoiceUtil
 import com.wdkl.ncs.android.middleware.tcp.dto.TcpModel
@@ -65,6 +66,8 @@ import org.greenrobot.eventbus.ThreadMode
 import serialporttest.utils.SerialPortUtil
 import java.io.DataOutputStream
 import java.io.IOException
+import java.io.PrintWriter
+import java.lang.Process
 import java.lang.ref.WeakReference
 
 
@@ -120,6 +123,8 @@ class CallingbedActivity :BaseActivity<CallingbedActivityPresenter, CallingbedMa
     //呼叫护士
     //private val callNurseFragment = "call_nurse_fragment"
 
+    private val uninstallApk = true
+
     companion object {
         private const val TIME_WHAT = 1000
     }
@@ -151,10 +156,12 @@ class CallingbedActivity :BaseActivity<CallingbedActivityPresenter, CallingbedMa
         //音频初始化
         SoundPoolHelper.getInstance().init(applicationContext)
 
-        AppTool.Time.delay(2000) {
+        AppTool.Time.delay(1500) {
             //打开手柄mic
             SerialPortHelper.setHandsMIC(true)
             SerialPortHelper.setSosLight("0")
+            //初始化灭掉护理灯
+            SerialPortHelper.dismissNurseLedLight()
         }
 
         EventBus.getDefault().register(this)
@@ -170,7 +177,17 @@ class CallingbedActivity :BaseActivity<CallingbedActivityPresenter, CallingbedMa
         switchToMainFragment()
 
         //默认打开网络调试
-        openNetwrokDebug()
+        //openNetwrokDebug()
+
+        //卸载原来二代系统床头分机apk
+        if (uninstallApk) {
+            //卸载老的5寸分机app
+            Thread {
+                if (checkAppExist()) {
+                    uninstallApp()
+                }
+            }.start()
+        }
     }
 
     //开启网络调试
@@ -204,6 +221,35 @@ class CallingbedActivity :BaseActivity<CallingbedActivityPresenter, CallingbedMa
         os.flush()
     }
 
+    private fun checkAppExist() : Boolean {
+        val packageInfo = packageManager.getInstalledPackages(0)
+        var appExist = false
+        for (pInfo in packageInfo) {
+            val appName = "com.wdkl.callingbed"
+            if (appName == pInfo.packageName) {
+                appExist = true
+                break
+            }
+        }
+        Log.e("callingbed", "callingbed app exist: " + appExist)
+        return appExist
+    }
+
+    private fun uninstallApp() {
+        val process: Process
+        val printWriter: PrintWriter
+        try {
+            process = Runtime.getRuntime().exec("su")
+            printWriter = PrintWriter(process.outputStream)
+            printWriter.println("pm uninstall com.wdkl.callingbed")
+            printWriter.flush()
+            printWriter.close()
+            Log.e("uninstall", "uninstall end")
+        } catch (e: java.lang.Exception) {
+            Log.e("uninstall", "uninstall e:" + e.message)
+        }
+    }
+
     override fun bindEvent() {
     }
 
@@ -238,9 +284,6 @@ class CallingbedActivity :BaseActivity<CallingbedActivityPresenter, CallingbedMa
         nurseConfigAdpter = NurseConfigAdpter(activity, configList)
         rv_left_list.layoutManager = linearLayout
         rv_left_list.adapter = nurseConfigAdpter
-
-        //初始化灭掉护理灯
-        SerialPortHelper.dismissNurseLedLight()
     }
 
     //数据加载错误
@@ -381,7 +424,11 @@ class CallingbedActivity :BaseActivity<CallingbedActivityPresenter, CallingbedMa
     override fun updateNurseConfig(list: List<NurseConfigDto>) {
         if (list.isNotEmpty()) {
             for ((index, e) in list.withIndex()) {
-                configList.set(index, e)
+                if (index < configList.size) {
+                    configList.set(index, e)
+                } else {
+                    configList.add(e)
+                }
             }
             nurseConfigAdpter.updateData(configList)
             //护理灯刷新
@@ -719,7 +766,17 @@ class CallingbedActivity :BaseActivity<CallingbedActivityPresenter, CallingbedMa
         backTimeout = 0
         if (isVisible(right_menu)) {
             hideRightMenu(true)
-            //showMessage("增援请求已发送!")
+            showMessage("增援请求已发送!")
+            if (Constant.TCP_CONNECTED) {
+                if (Constant.DEVICE_ID != -1) {
+                    OtherUtil.sendReinforce(Constant.DEVICE_ID)
+                } else {
+                    showMessage("没有设备id!")
+                }
+            } else {
+                showMessage("网络异常,请求失败!")
+            }
+
             //switchToFragment(R.id.callingbed_main_frame, SupportFragment(), supportFragment)
             //SoundPoolHelper.getInstance().playSound(2)
         } else {
@@ -888,25 +945,31 @@ class CallingbedActivity :BaseActivity<CallingbedActivityPresenter, CallingbedMa
                     val tcpModel = messageEvent.message as TcpModel
                     Log.d("TCP", "received tcp action: " + tcpModel.action + ", type: " + tcpModel.type)
                     if (tcpModel.getType() == TcpType.VOICE) {
-                        val interactionVO = Gson().fromJson(tcpModel.data.toString(), InteractionVO::class.java)
-                        if (tcpModel.action == TcpAction.VoiceAction.CALL) {
-                            Constant.fromId = tcpModel.fromId
-                            Constant.interactionId = interactionVO.id
-                            Constant.TARGET_SIP = interactionVO.fromSipId
-                            Constant.CALL_STATE = Constant.CALL_INCOMING
-                            //通话之前先判断webrtc socket是否连接上,否则不能建立通话
-                            if (Constant.TCP_CONNECTED && !TextUtils.isEmpty(Constant.SIP_ID)) {
-                                //来电界面
-                                var fragment = SkyCallFragment()
-                                var bundle = Bundle()
-                                bundle.putInt("call_state", 1)
-                                bundle.putSerializable("tcp_model", tcpModel)
-                                fragment.arguments = bundle
-                                addCallFragment(fragment)
-                            } else {
-                                showMessage("服务未连接或sipId为空")
-                                Constant.CALL_STATE = Constant.CALL_STANDBY
-                                VoiceUtil.rejectAudioCall(Constant.DEVICE_ID, Constant.fromId, Constant.interactionId)
+                        if (tcpModel.data != null) {
+                            val interactionVO = Gson().fromJson(tcpModel.data.toString(), InteractionVO::class.java)
+                            if (tcpModel.action == TcpAction.VoiceAction.CALL) {
+                                Constant.fromId = tcpModel.fromId
+                                Constant.interactionId = interactionVO.id
+                                Constant.TARGET_SIP = interactionVO.fromSipId
+                                Constant.CALL_STATE = Constant.CALL_INCOMING
+                                //通话之前先判断webrtc socket是否连接上,否则不能建立通话
+                                if (Constant.TCP_CONNECTED && !TextUtils.isEmpty(Constant.SIP_ID)) {
+                                    //来电界面
+                                    var fragment = SkyCallFragment()
+                                    var bundle = Bundle()
+                                    bundle.putInt("call_state", 1)
+                                    bundle.putSerializable("tcp_model", tcpModel)
+                                    fragment.arguments = bundle
+                                    addCallFragment(fragment)
+                                } else {
+                                    showMessage("服务未连接或sipId为空")
+                                    Constant.CALL_STATE = Constant.CALL_STANDBY
+                                    VoiceUtil.rejectAudioCall(
+                                        Constant.DEVICE_ID,
+                                        Constant.fromId,
+                                        Constant.interactionId
+                                    )
+                                }
                             }
                         }
                     } else if (tcpModel.type == TcpType.SIDE) {

+ 6 - 1
callingbed/src/main/java/com/wdkl/app/ncs/callingbed/fragment/MainFragment.kt

@@ -9,6 +9,7 @@ import com.wdkl.app.ncs.callingbed.BuildConfig
 import com.wdkl.app.ncs.callingbed.R
 import com.wdkl.app.ncs.callingbed.activity.CallingbedActivity
 import com.wdkl.app.ncs.callingbed.databinding.MainViewLayoutBinding
+import com.wdkl.app.ncs.callingbed.helper.SerialPortHelper
 import com.wdkl.app.ncs.callingbed.launch.CallingbedLaunch
 import com.wdkl.app.ncs.callingbed.net.NettyClient
 //import com.wdkl.app.ncs.sip.activity.VoipAudioActivity
@@ -87,7 +88,11 @@ class MainFragment: BaseFragment<MainFragmentPresenter, MainViewLayoutBinding>()
 
         //更新护理项
         if (customInfo.list != null) {
-            (activity as CallingbedActivity).updateNurseConfig(customInfo.list)
+            AppTool.Time.delay(1800) {
+                if (activity != null) {
+                    (activity as CallingbedActivity).updateNurseConfig(customInfo.list)
+                }
+            }
         }
     }
 

+ 61 - 48
callingbed/src/main/java/com/wdkl/app/ncs/callingbed/fragment/SkyCallFragment.kt

@@ -75,7 +75,7 @@ class SkyCallFragment: BaseCallFragment(), CallSessionCallback {
         }
 
         //初始化 engine
-        WebRTCEngine.getInstance().init(true, activity)
+        WebRTCEngine.getInstance().init(true, this.context)
         //初始化 janusClient
         janusClient = JanusClient(com.wdkl.ncs.janus.util.Constant.JANUS_URL, Constant.SIP_ID.toBigInteger())
 
@@ -268,9 +268,9 @@ class SkyCallFragment: BaseCallFragment(), CallSessionCallback {
 
                 janusClient!!.disConnect()
             }
-        }
 
-        backToMain()
+            backToMain()
+        }
     }
 
     //探视
@@ -511,58 +511,71 @@ class SkyCallFragment: BaseCallFragment(), CallSessionCallback {
                 if (messageEvent.message is TcpModel) {
                     val curTcpModel = messageEvent.message as TcpModel
                     if (curTcpModel.getType() == TcpType.VOICE) {
-                        val curInteractionVO = Gson().fromJson(curTcpModel.data.toString(), InteractionVO::class.java)
-                        if (curTcpModel.getAction() == TcpAction.VoiceAction.ACCEPT) {
-                            //我方呼出,对方接受
-                            RingPlayHelper.stopRingTone()
-                            Constant.interactionId = curInteractionVO.id
-                            fromId = curTcpModel.fromId
-                            acceptCall()
-                            if (TextUtils.isEmpty(curInteractionVO.toSipId)) {
-                                //通话失败,重置并返回主界面
-                                showMessage("targetSipId为空!")
-                                Constant.CALL_STATE = Constant.CALL_STANDBY
-                                VoiceUtil.handoffAudioCall(Constant.DEVICE_ID, fromId, Constant.interactionId)
-                                callEnd()
-                            }
-                        } else if (curTcpModel.getAction() == TcpAction.VoiceAction.REJECT) {
-                            //我方呼出,对方拒绝
-                            showMessage("对方已拒绝!")
-                            RingPlayHelper.stopRingTone()
+                        if (curTcpModel.action == TcpAction.VoiceAction.CANCEL_BY_DOOR) {
+                            Constant.CALL_STATE = Constant.CALL_STANDBY
+                            VoiceUtil.cancelAudioCall(Constant.DEVICE_ID)
                             cancelCall()
-                        } else if (curTcpModel.getAction() == TcpAction.VoiceAction.CALLING) {
-                            //我方呼出,对方通话中
-                            showMessage("对方正在忙线中,暂时无法接听!")
-                            /*AppTool.Time.delay(1000) {
+                            return
+                        }
+
+                        if (curTcpModel.data != null) {
+                            val curInteractionVO = Gson().fromJson(curTcpModel.data.toString(), InteractionVO::class.java)
+                            if (curTcpModel.getAction() == TcpAction.VoiceAction.ACCEPT) {
+                                //我方呼出,对方接受
+                                RingPlayHelper.stopRingTone()
+                                Constant.interactionId = curInteractionVO.id
+                                fromId = curTcpModel.fromId
+                                acceptCall()
+                                if (TextUtils.isEmpty(curInteractionVO.toSipId)) {
+                                    //通话失败,重置并返回主界面
+                                    showMessage("targetSipId为空!")
+                                    Constant.CALL_STATE = Constant.CALL_STANDBY
+                                    VoiceUtil.handoffAudioCall(
+                                        Constant.DEVICE_ID,
+                                        fromId,
+                                        Constant.interactionId
+                                    )
+                                    callEnd()
+                                }
+                            } else if (curTcpModel.getAction() == TcpAction.VoiceAction.REJECT) {
+                                //我方呼出,对方拒绝
+                                showMessage("对方已拒绝!")
                                 RingPlayHelper.stopRingTone()
                                 cancelCall()
-                            }*/
-                        } else if (curTcpModel.getAction() == TcpAction.VoiceAction.SUCCESS) {
-                            //呼叫成功
-                            //本机呼叫的时候tcpModel为空,只有呼叫成功的时候才能获得对应tcp相关数据
-                            callSuccess = true
-                            sky_voice_call_hangup.isEnabled = true
-                            interactionVO = curInteractionVO
-                            Constant.interactionId = curInteractionVO.id
-                            showOutgoingCall()
-                            janusClient!!.connect()
-                        } else if (curTcpModel.getAction() == TcpAction.VoiceAction.FAILED) {
-                            //我方呼出,对方不在线,设备离线或其它错误
-                            callSuccess = true
-                            showMessage("呼叫失败,找不到设备或对方不在线!")
-                            RingPlayHelper.stopRingTone()
-                            cancelCall()
-                        } else if (curTcpModel.getAction() == TcpAction.VoiceAction.HANDOFF) {
-                            //对方挂断,不论我方呼出或呼入
-                            if (Constant.interactionId == curInteractionVO.id) {
+                            } else if (curTcpModel.getAction() == TcpAction.VoiceAction.CALLING) {
+                                //我方呼出,对方通话中
+                                showMessage("对方正在忙线中,暂时无法接听!")
+                                /*AppTool.Time.delay(1000) {
                                 RingPlayHelper.stopRingTone()
                                 cancelCall()
-                            }
-                        } else if (curTcpModel.getAction() == TcpAction.VoiceAction.CANCEL) {
-                            //对方呼叫时取消
-                            if (Constant.interactionId == curInteractionVO.id) {
+                            }*/
+                            } else if (curTcpModel.getAction() == TcpAction.VoiceAction.SUCCESS) {
+                                //呼叫成功
+                                //本机呼叫的时候tcpModel为空,只有呼叫成功的时候才能获得对应tcp相关数据
+                                callSuccess = true
+                                sky_voice_call_hangup.isEnabled = true
+                                interactionVO = curInteractionVO
+                                Constant.interactionId = curInteractionVO.id
+                                showOutgoingCall()
+                                janusClient!!.connect()
+                            } else if (curTcpModel.getAction() == TcpAction.VoiceAction.FAILED) {
+                                //我方呼出,对方不在线,设备离线或其它错误
+                                callSuccess = true
+                                showMessage("呼叫失败,找不到设备或对方不在线!")
                                 RingPlayHelper.stopRingTone()
                                 cancelCall()
+                            } else if (curTcpModel.getAction() == TcpAction.VoiceAction.HANDOFF) {
+                                //对方挂断,不论我方呼出或呼入
+                                if (Constant.interactionId == curInteractionVO.id) {
+                                    RingPlayHelper.stopRingTone()
+                                    cancelCall()
+                                }
+                            } else if (curTcpModel.getAction() == TcpAction.VoiceAction.CANCEL) {
+                                //对方呼叫时取消
+                                if (Constant.interactionId == curInteractionVO.id) {
+                                    RingPlayHelper.stopRingTone()
+                                    cancelCall()
+                                }
                             }
                         }
                     }

+ 6 - 1
callingbed/src/main/java/com/wdkl/app/ncs/callingbed/helper/SerialPortHelper.java

@@ -92,7 +92,12 @@ public class SerialPortHelper {
             public void run() {
                 try {
                     float p = (float) brightnessPercent / 100;
-                    for (int i = 0; i < nurseConfigs.size(); i++) {
+                    int size = nurseConfigs.size();
+                    //只有5个护理灯,超出无效
+                    if (size > 5) {
+                        size = 5;
+                    }
+                    for (int i = 0; i < size; i++) {
                         String color = nurseConfigs.get(i).getNurseColorRbg();
                         if (StringUtils.notEmpty(color)) {
                             int rr = (int) ((StringUtils.parseHex2Int(StringUtils.substringByLengh(color, 0, 2))) * p);

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

@@ -24,6 +24,14 @@ public class OtherUtil {
         return tcpModel;
     }
 
+    public static TcpModel reInforce(Integer fromId){
+        TcpModel tcpModel = new TcpModel();
+        tcpModel.setType(TcpType.REINFORCE);
+        tcpModel.setAction(TcpAction.ReinforceAction.CALL);
+        tcpModel.setFromId(fromId);
+        return tcpModel;
+    }
+
     //发送sos相关tcp
     public static void sendSosCall(Integer fromId) {
         TcpModel tcpModel = OtherUtil.SOSCall(fromId);
@@ -34,4 +42,9 @@ public class OtherUtil {
         TcpModel tcpModel = OtherUtil.SOSCancel(fromId, toId);
         TcpClient.getInstance().sendMsg(tcpModel.toJson());
     }
+
+    public static void sendReinforce(Integer fromId) {
+        TcpModel tcpModel = reInforce(fromId);
+        TcpClient.getInstance().sendMsg(tcpModel.toJson());
+    }
 }

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

@@ -40,6 +40,41 @@ public interface TcpAction {
         }
     }
 
+    enum PhoneAction implements TcpAction {
+        CALL("呼叫"),
+        ACCEPT("接受呼叫"),
+        REJECT("拒绝"),
+        CALLING("通话中"),
+        HANDOFF("挂断"),
+        DATA("数据传输"),
+        CANCEL("取消");
+
+
+        private String description;
+        PhoneAction(String description){
+            this.description = description;
+        }
+
+        public String getDescription() {
+            return description;
+        }
+
+        public String getName(){
+            return this.name();
+        }
+
+        private final static Map<String , PhoneAction> ENUM_MAP = new HashMap<String, PhoneAction>();
+        static {
+            for(PhoneAction v : values()) {
+                ENUM_MAP.put(v.toString() , v);
+            }
+        }
+        public static PhoneAction fromString(String v) {
+            PhoneAction userOptionEnum = ENUM_MAP.get(v);
+            return userOptionEnum == null ? CALL :userOptionEnum;
+        }
+    }
+
     enum VoiceAction implements TcpAction {
         CALL("呼叫"),
         ACCEPT("接受呼叫"),
@@ -49,8 +84,12 @@ public interface TcpAction {
         TRANSFER("转接"),
         HANDOFF("挂断"),
         CANCEL("取消"),
+        PCALLING("已经通话中"),
+        VOICE_OFF("通话被接听"),
+        CANCEL_BY_DOOR("门口机取消分机呼叫"),
         RS485CALL("485界面发起呼叫"),
         RS485CANCEL("485界面呼叫取消"),
+        RS485CANCEL_BY_DOOR("485门口机取消房间内的呼叫"),
         RS485HANDOFF("485界面挂断"),
         RS485ACCEPT("485界面接听"),
         RS485REJECT("485界面拒绝"),
@@ -129,7 +168,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){
@@ -156,10 +207,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("语音留言"),
-        MSG_READ("语音留言已读");
+        MSG_READ("语音留言已读"),
+        RECEIVED("客户端收到确认");
 
         private String description;
         IMAction(String description){
@@ -187,6 +268,37 @@ public interface TcpAction {
 
     }
 
+    enum CHANNELIMAction implements TcpAction {
+        MSG("语音留言"),
+        MSG_READ("语音留言已读"),
+        RECEIVED("接收端收到确认");
+
+        private String description;
+        CHANNELIMAction(String description){
+            this.description = description;
+        }
+
+        public String getDescription() {
+            return description;
+        }
+
+        public String getName(){
+            return this.name();
+        }
+
+        private final static Map<String , CHANNELIMAction> ENUM_MAP = new HashMap<String, CHANNELIMAction>();
+        static {
+            for(CHANNELIMAction v : values()) {
+                ENUM_MAP.put(v.toString() , v);
+            }
+        }
+        public static CHANNELIMAction fromString(String v) {
+            CHANNELIMAction userOptionEnum = ENUM_MAP.get(v);
+            return userOptionEnum == null ? MSG_READ :userOptionEnum;
+        }
+
+    }
+
     enum DeviceAction implements TcpAction {
         RESTART("重启"),
         CONNECT("连接"),
@@ -222,7 +334,11 @@ public interface TcpAction {
 
     enum EventAction implements TcpAction {
         KEY_CLICK("按键事件"),
-        RESPONSE("已响应");
+        RESPONSE("已响应"),
+        RECEIVED("接收端收到确认"),
+        CANCEL("取消"),
+        CANCEL_CONFIRM("接收端确认收到取消"),
+        COMPLETED("完成");
         private String description;
         EventAction(String description){
             this.description = description;

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

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