|
@@ -0,0 +1,784 @@
|
|
|
+package com.wdkl.app.ncs.callingbed2.activity
|
|
|
+
|
|
|
+import android.content.BroadcastReceiver
|
|
|
+import android.content.Context
|
|
|
+import android.content.Intent
|
|
|
+import android.content.IntentFilter
|
|
|
+import android.net.ConnectivityManager
|
|
|
+import android.os.*
|
|
|
+import android.support.v4.app.Fragment
|
|
|
+import android.support.v7.widget.LinearLayoutManager
|
|
|
+import android.text.TextUtils
|
|
|
+import android.util.Log
|
|
|
+import android.view.View
|
|
|
+import com.enation.javashop.android.jrouter.external.annotation.Router
|
|
|
+import com.enation.javashop.net.engine.model.NetState
|
|
|
+import com.google.gson.Gson
|
|
|
+import com.wdkl.app.ncs.callingbed2.BuildConfig
|
|
|
+import com.wdkl.app.ncs.callingbed2.R
|
|
|
+import com.wdkl.app.ncs.callingbed2.adapter.NurseConfigAdpter
|
|
|
+import com.wdkl.app.ncs.callingbed2.agreement.Callingbed2Agreement
|
|
|
+import com.wdkl.app.ncs.callingbed2.databinding.Callingbed2MainLayBinding
|
|
|
+import com.wdkl.app.ncs.callingbed2.fragment.*
|
|
|
+import com.wdkl.app.ncs.callingbed2.helper.*
|
|
|
+import com.wdkl.app.ncs.callingbed2.launch.Callingbed2Launch
|
|
|
+import com.wdkl.app.ncs.callingbed2.settings.SettingConfig
|
|
|
+import com.wdkl.core.consts.Urls
|
|
|
+import com.wdkl.core.socket.IUserState
|
|
|
+import com.wdkl.core.socket.SocketManager
|
|
|
+import com.wdkl.ncs.android.lib.base.BaseActivity
|
|
|
+import com.wdkl.ncs.android.lib.utils.*
|
|
|
+import com.wdkl.ncs.android.lib.vo.filter
|
|
|
+import com.wdkl.ncs.android.lib.widget.MenuDialog
|
|
|
+import com.wdkl.ncs.android.middleware.common.Constant
|
|
|
+import com.wdkl.ncs.android.middleware.common.MessageEvent
|
|
|
+import com.wdkl.ncs.android.middleware.common.SipStatus
|
|
|
+import com.wdkl.ncs.android.middleware.logic.contract.callingbed2.Callingbed2ActivityContract
|
|
|
+import com.wdkl.ncs.android.middleware.logic.presenter.callingbed2.Callingbed2ActivityPresenter
|
|
|
+import com.wdkl.ncs.android.middleware.model.dos.AppVersionDO
|
|
|
+import com.wdkl.ncs.android.middleware.model.dos.PartSettingDO
|
|
|
+import com.wdkl.ncs.android.middleware.model.dto.NurseConfigDto
|
|
|
+import com.wdkl.ncs.android.middleware.model.dto.TcpSeverDTO
|
|
|
+import com.wdkl.ncs.android.middleware.model.vo.BedDeviceInfoVO
|
|
|
+import com.wdkl.ncs.android.middleware.model.vo.CallRecordVO
|
|
|
+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.VideoUtil
|
|
|
+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 kotlinx.android.synthetic.main.callingbed2_main_lay.*
|
|
|
+import kotlinx.android.synthetic.main.view_title_layout.*
|
|
|
+import org.greenrobot.eventbus.EventBus
|
|
|
+import org.greenrobot.eventbus.Subscribe
|
|
|
+import org.greenrobot.eventbus.ThreadMode
|
|
|
+import serialporttest.utils.SerialPortUtil
|
|
|
+
|
|
|
+
|
|
|
+/**
|
|
|
+ * Callingbed2Activity :BaseActivity<Callingbed2ActivityPresenter, Callingbed2MainLayBinding>
|
|
|
+ * Callingbed2ActivityPresenter: 位置com.wdkl.ncs.android.middleware.logic.presenter.callingbed2
|
|
|
+ * Callingbed2MainLayBinding: 位置callingbed2_main_lay.xml
|
|
|
+ * Callingbed2ActivityContract: 位置com.wdkl.ncs.android.middleware.logic.contract.callingbed2
|
|
|
+ */
|
|
|
+
|
|
|
+@Router(path = "/callingbed2/main")
|
|
|
+class Callingbed2Activity :BaseActivity<Callingbed2ActivityPresenter, Callingbed2MainLayBinding>(), Callingbed2ActivityContract.View, Callingbed2Agreement,
|
|
|
+ /*IEventListener,*/ SerialPortUtil.ISerialPortBedOnclickEvent, SerialPortUtil.ISerialPortBedOnclickString, IUserState {
|
|
|
+
|
|
|
+ private lateinit var receiver: TimeReceiver
|
|
|
+ private lateinit var curFragment: String
|
|
|
+ //首页
|
|
|
+ private val mainFragment = "main_fragment"
|
|
|
+ //语音留言
|
|
|
+ private val costFragment = "cost_fragment"
|
|
|
+ //二维码
|
|
|
+ private val qrFragment = "qr_fragment"
|
|
|
+
|
|
|
+ //通话界面fragment
|
|
|
+ private var skyCallFragment: Fragment? = null
|
|
|
+
|
|
|
+ private lateinit var linearLayout : LinearLayoutManager
|
|
|
+ private lateinit var nurseConfigAdpter : NurseConfigAdpter
|
|
|
+ private var configList = ArrayList<NurseConfigDto>()
|
|
|
+ private var updating :Boolean = false
|
|
|
+
|
|
|
+ private var clickTime : Long = 0
|
|
|
+ private var clickSosTime : Long = 0
|
|
|
+
|
|
|
+ //网络异常计数
|
|
|
+ private var netErrCount : Int = 0
|
|
|
+
|
|
|
+ override fun getLayId(): Int {
|
|
|
+ return R.layout.callingbed2_main_lay;
|
|
|
+ }
|
|
|
+
|
|
|
+ override fun bindDagger() {
|
|
|
+ Callingbed2Launch.component.inject(this)
|
|
|
+ }
|
|
|
+
|
|
|
+ override fun init() {
|
|
|
+ //开始ping网络,30秒ping一次
|
|
|
+ //NetHelper.startNetCheck()
|
|
|
+
|
|
|
+ //获取mac地址
|
|
|
+ Constant.LOCAL_MAC = NetHelper.getInstance().macAddress
|
|
|
+
|
|
|
+ presenter.loadTcpServerHost()
|
|
|
+
|
|
|
+ //注册广播
|
|
|
+ regReceiver()
|
|
|
+ RecordHelper.getInstance().init()
|
|
|
+
|
|
|
+ initNurseConfig()
|
|
|
+
|
|
|
+ EventBus.getDefault().register(this)
|
|
|
+
|
|
|
+ // 添加登录回调
|
|
|
+ SocketManager.getInstance().addUserStateCallback(this)
|
|
|
+
|
|
|
+ if (Build.MODEL.equals("rk3128")) {
|
|
|
+ //串口监听
|
|
|
+ setSerialListner()
|
|
|
+ //打开手柄mic
|
|
|
+ SerialPortHelper.setHandsMIC(true)
|
|
|
+ SerialPortHelper.setCallStatus("0")
|
|
|
+ SerialPortHelper.setSosLight("0")
|
|
|
+ }
|
|
|
+
|
|
|
+ initDevice()
|
|
|
+
|
|
|
+ //更新状态图标
|
|
|
+ updateNetState()
|
|
|
+
|
|
|
+ //启动主fragment
|
|
|
+ switchFragment(R.id.callingbed2_main_frame, MainFragment(), mainFragment)
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ override fun userLogin() {
|
|
|
+ updateStatus(SipStatus.REGISTERCOM)
|
|
|
+ }
|
|
|
+
|
|
|
+ override fun userLogout() {
|
|
|
+ updateStatus(SipStatus.REGISTERFAIL)
|
|
|
+ }
|
|
|
+
|
|
|
+ fun switchFragment(id: Int, fragment: Fragment, tag: String) {
|
|
|
+ supportFragmentManager.beginTransaction()
|
|
|
+ .replace(id, fragment, tag)
|
|
|
+ .commit()
|
|
|
+ curFragment = tag
|
|
|
+ }
|
|
|
+
|
|
|
+ fun addCallFragment(fragment: Fragment) {
|
|
|
+ skyCallFragment = fragment
|
|
|
+ supportFragmentManager.beginTransaction()
|
|
|
+ .setCustomAnimations(R.anim.slide_down_in, R.anim.slide_up_out)
|
|
|
+ .add(R.id.call_frame, fragment)
|
|
|
+ .commit()
|
|
|
+ }
|
|
|
+
|
|
|
+ fun removeCallFragment() {
|
|
|
+ if (skyCallFragment != null) {
|
|
|
+ supportFragmentManager.beginTransaction()
|
|
|
+ //.setCustomAnimations(R.anim.slide_down_in, R.anim.slide_down_out)
|
|
|
+ .remove(skyCallFragment)
|
|
|
+ .commit()
|
|
|
+ skyCallFragment = null
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ fun initDevice() {
|
|
|
+ if (!TextUtils.isEmpty(Constant.LOCAL_MAC)) {
|
|
|
+ presenter.loadDeviceInfo(Constant.LOCAL_MAC)
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ override fun bindEvent() {
|
|
|
+ tv_btn_home.setOnClickListener {
|
|
|
+ //首页
|
|
|
+ if (!mainFragment.equals(curFragment)) {
|
|
|
+ switchFragment(R.id.callingbed2_main_frame, MainFragment(), mainFragment)
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ tv_btn_more.setOnClickListener {
|
|
|
+ //更多
|
|
|
+ if (!qrFragment.equals(curFragment)) {
|
|
|
+ switchFragment(R.id.callingbed2_main_frame, QrCodeFragment(), qrFragment)
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ tv_btn_cost.setOnClickListener {
|
|
|
+ //费用
|
|
|
+ if (!costFragment.equals(curFragment)) {
|
|
|
+ switchFragment(R.id.callingbed2_main_frame, CostFragment(), costFragment)
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ tv_btn_support.setOnClickListener {
|
|
|
+ //增援
|
|
|
+ showMessage("增援请求已发送!")
|
|
|
+ }
|
|
|
+
|
|
|
+ tv_btn_voice_call.setOnClickListener {
|
|
|
+ val time = System.currentTimeMillis()
|
|
|
+ if (time - clickTime > 2000) {
|
|
|
+ //防止重复点击
|
|
|
+ if (!TextUtils.isEmpty(Constant.SIP_ID)) {
|
|
|
+ //没有摄像头则只能拨打语音
|
|
|
+ if (Constant.supportCamera) {
|
|
|
+ MenuDialog.build(this)
|
|
|
+ .config(voiceCall = {
|
|
|
+ startCall(Constant.VOICE_CALL)
|
|
|
+ }, videoCall = {
|
|
|
+ startCall(Constant.VIDEO_CALL)
|
|
|
+ }).show()
|
|
|
+ } else {
|
|
|
+ startCall(Constant.VOICE_CALL)
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ showMessage("当前设备可能未办理入住,不能呼叫")
|
|
|
+ }
|
|
|
+
|
|
|
+ clickTime = time
|
|
|
+ } else {
|
|
|
+ showMessage("请勿频繁点击...")
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ //设置串口监听
|
|
|
+ private fun setSerialListner() {
|
|
|
+ SerialPortUtil.getInstance().setOnDataReceiveListener(this)
|
|
|
+ SerialPortUtil.getInstance().setOnDataReceiveStringListener(this)
|
|
|
+ //开启串口心跳
|
|
|
+ SerialPortUtil.getInstance().startHeartBeat()
|
|
|
+ }
|
|
|
+
|
|
|
+ private fun initNurseConfig() {
|
|
|
+ //初始化默认护理项
|
|
|
+ for (index in 1..5) {
|
|
|
+ var item = NurseConfigDto()
|
|
|
+ item.nurseConfigName = "暂无"
|
|
|
+ item.nurseOptionName = "暂无"
|
|
|
+ item.nurseColorRbg = "E7E7E7"
|
|
|
+ configList.add(item)
|
|
|
+ }
|
|
|
+
|
|
|
+ linearLayout = LinearLayoutManager(activity)
|
|
|
+ nurseConfigAdpter = NurseConfigAdpter(activity, configList)
|
|
|
+ rv_left_list.layoutManager = linearLayout
|
|
|
+ rv_left_list.adapter = nurseConfigAdpter
|
|
|
+ }
|
|
|
+
|
|
|
+ override fun updateNurseConfig(list: List<NurseConfigDto>) {
|
|
|
+ if (list.size > 0) {
|
|
|
+ for ((index, e) in list.withIndex()) {
|
|
|
+ configList.set(index, e)
|
|
|
+ }
|
|
|
+ nurseConfigAdpter.updateData(configList)
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ override fun checkAppVersion() {
|
|
|
+ Constant.APP_PATH = ""
|
|
|
+ //获取APP版本信息,7寸分机type=204
|
|
|
+ if (Constant.PART_ID != null) {
|
|
|
+ presenter.getAppVersion(Constant.PART_ID, 204)
|
|
|
+ }
|
|
|
+ Log.d("AppUpdate", "checkAppVersion =====>> Constant.PART_ID: " + Constant.PART_ID)
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ override fun destory() {
|
|
|
+ configList.clear()
|
|
|
+ unRegReceiver()
|
|
|
+ EventBus.getDefault().unregister(this)
|
|
|
+ Constant.CALL_STATE = Constant.CALL_STANDBY
|
|
|
+ SerialPortUtil.getInstance().closeHeart()
|
|
|
+ SerialPortUtil.getInstance().closeSerialPort()
|
|
|
+ }
|
|
|
+
|
|
|
+ //数据加载错误
|
|
|
+ override fun onError(message: String, type: Int) {
|
|
|
+ errorLog("error",message)
|
|
|
+ showMessage("数据加载错误")
|
|
|
+ //加载失败,重置customid
|
|
|
+ //Constant.CUSTOM_ID = -1
|
|
|
+ }
|
|
|
+
|
|
|
+ //没有网络
|
|
|
+ override fun onNoNet() {
|
|
|
+ showMessage("没有网络")
|
|
|
+ //加载失败,重置customid
|
|
|
+ //Constant.CUSTOM_ID = -1
|
|
|
+ }
|
|
|
+
|
|
|
+ //数据加载完成
|
|
|
+ override fun complete(message: String, type: Int) {
|
|
|
+ }
|
|
|
+
|
|
|
+ //开始获取数据
|
|
|
+ override fun start() {
|
|
|
+ }
|
|
|
+
|
|
|
+ //网络监听
|
|
|
+ override fun networkMonitor(state: NetState) {
|
|
|
+ state.filter(onMobile = {
|
|
|
+
|
|
|
+ },onWifi = {
|
|
|
+
|
|
|
+ },offline = {
|
|
|
+
|
|
|
+ })
|
|
|
+ }
|
|
|
+
|
|
|
+ //显示设备信息
|
|
|
+ override fun showDeviceInfo(deviceInfo: BedDeviceInfoVO) {
|
|
|
+ Constant.SIP_ID = deviceInfo.sipId
|
|
|
+ Constant.DEVICE_ID = deviceInfo.id
|
|
|
+ Constant.PART_ID = deviceInfo.partId
|
|
|
+ Constant.BED_NAME = deviceInfo.fullName
|
|
|
+
|
|
|
+ Constant.DEVICE_TYPE = deviceInfo.deviceType
|
|
|
+ Constant.DEVICE_CODE = deviceInfo.code
|
|
|
+ Constant.DEVICE_MODEL = deviceInfo.model
|
|
|
+ Constant.DEVICE_SOFT_VER = deviceInfo.softVer
|
|
|
+ Constant.DEVICE_HARD_VER = deviceInfo.hardVer
|
|
|
+ Constant.DEVICE_NAME = deviceInfo.name
|
|
|
+
|
|
|
+ view_title_layout_tv_hospital_name.text = deviceInfo.hospitalName + deviceInfo.partName
|
|
|
+ if (deviceInfo.customerId != null) {
|
|
|
+ Constant.CUSTOM_ID = deviceInfo.customerId
|
|
|
+ EventBus.getDefault().post(MessageEvent("updateCustom", Constant.EVENT_UPDATE_CUSTOM))
|
|
|
+ }
|
|
|
+ presenter.loadPartSettings(Constant.PART_ID)
|
|
|
+
|
|
|
+ connectSocket()
|
|
|
+
|
|
|
+ //检查版本
|
|
|
+ //checkAppVersion()
|
|
|
+ }
|
|
|
+
|
|
|
+ private fun connectSocket(){
|
|
|
+ //拿到sip账号之后再注册
|
|
|
+ if (!TextUtils.isEmpty(Constant.SIP_ID)) {
|
|
|
+ // 连接socket登录
|
|
|
+ SocketManager.getInstance().connect(Urls.WS, Constant.SIP_ID, 0)
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ //显示交互记录
|
|
|
+ override fun showCallRecords(record: CallRecordVO) {
|
|
|
+ //
|
|
|
+ }
|
|
|
+
|
|
|
+ override fun setPartSettings(partSetting: PartSettingDO) {
|
|
|
+ //设置白昼起止时间
|
|
|
+ SettingConfig.setInitialDayTime(this, partSetting.dayStart.substring(0,5))
|
|
|
+ SettingConfig.setEndOfDay(this,partSetting.nightStart.substring(0,5))
|
|
|
+
|
|
|
+ //分机白天夜晚亮度
|
|
|
+ SettingConfig.setExtensionDaytimeBrightness(this, partSetting.dayLight)
|
|
|
+ SettingConfig.setExtensionNightBrightness(this, partSetting.nightLight)
|
|
|
+
|
|
|
+ //分机白天夜晚护理灯 也就是LED灯的亮度
|
|
|
+ SettingConfig.setExtensionDaytimeLEDBrightness(this, partSetting.dayNurseLed)
|
|
|
+ SettingConfig.setExtensionNightLEDBrightness(this, partSetting.nightNurseLed)
|
|
|
+
|
|
|
+ //分机白天夜晚系统音量
|
|
|
+ SettingConfig.setExtensionDaytimeSystemVolume(this, partSetting.dayBedVol)
|
|
|
+ SettingConfig.setExtensionNightSystemVolume(this, partSetting.nightBedVol)
|
|
|
+
|
|
|
+ //分机通话音量 没做白昼区分
|
|
|
+ SettingConfig.setExtensionCallVolume(this, partSetting.dayBedVol)
|
|
|
+
|
|
|
+ SettingConfig.setSipOverTime(this, partSetting.sipOvertime)
|
|
|
+ SettingConfig.setSleepTime(this, partSetting.sleepSecondsBed)
|
|
|
+
|
|
|
+ updateSettings()
|
|
|
+ }
|
|
|
+
|
|
|
+ override fun setTcpServerHost(tcpSeverDTO: TcpSeverDTO) {
|
|
|
+ Constant.TCP_SERVER_URL = tcpSeverDTO.localIp
|
|
|
+ Constant.TCP_PORT = tcpSeverDTO.tcpPort
|
|
|
+ Constant.TCP_HEART_BEAT = tcpSeverDTO.readerIdleTime
|
|
|
+
|
|
|
+ //开启TCP连接
|
|
|
+ startTcp()
|
|
|
+ showMessage("tcp开始连接...host: " + Constant.TCP_SERVER_URL + ", port: " + Constant.TCP_PORT)
|
|
|
+ }
|
|
|
+
|
|
|
+ override fun loadAppVersion(appInfo: AppVersionDO) {
|
|
|
+ Log.d("AppUpdate", "loadAppVersion111 =====>> version_code: " + appInfo.versionCode + ", path: " + appInfo.appPath)
|
|
|
+ val newAppVersion = appInfo.versionCode.substring(1)
|
|
|
+ Log.d("AppUpdate", "loadAppVersion222 =====>> newAppVersion: " + newAppVersion + ", curAppVersion: " + BuildConfig.VERSION_NAME)
|
|
|
+ showMessage("获取版本成功,当前版本: " + BuildConfig.VERSION_NAME + ", 服务器版本: " + newAppVersion)
|
|
|
+
|
|
|
+ //服务器版本和当前版本不一致才做升级操作
|
|
|
+ if (!BuildConfig.VERSION_NAME.equals(newAppVersion) && !updating) {
|
|
|
+ Constant.APP_PATH = appInfo.appPath
|
|
|
+ updating = true
|
|
|
+ AppTool.Time.delay(200) {
|
|
|
+ push("/callingbed/update")
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ private fun startSipService() {
|
|
|
+ //val intent = Intent(BaseApplication.appContext, SipService::class.java)
|
|
|
+ //startService(intent)
|
|
|
+ }
|
|
|
+
|
|
|
+ fun startToActivity(intent: Intent) {
|
|
|
+ AppTool.Setting.startNewActivity(this@Callingbed2Activity, intent)
|
|
|
+ }
|
|
|
+
|
|
|
+ fun startTcp() {
|
|
|
+ if (Constant.TCP_SERVER_URL != null) {
|
|
|
+ Thread(Runnable { TcpClient.getInstance().init(Constant.TCP_SERVER_URL, Constant.TCP_PORT, Constant.TCP_HEART_BEAT) }).start()
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ private fun regReceiver() {
|
|
|
+ receiver = TimeReceiver()
|
|
|
+ var intentFilter = IntentFilter()
|
|
|
+ intentFilter.addAction(Intent.ACTION_TIME_TICK)
|
|
|
+ intentFilter.addAction(Intent.ACTION_TIMEZONE_CHANGED)
|
|
|
+ intentFilter.addAction(Intent.ACTION_TIME_CHANGED)
|
|
|
+ intentFilter.addAction(ConnectivityManager.CONNECTIVITY_ACTION)
|
|
|
+ registerReceiver(receiver, intentFilter)
|
|
|
+ }
|
|
|
+
|
|
|
+ private fun unRegReceiver() {
|
|
|
+ unregisterReceiver(receiver)
|
|
|
+ }
|
|
|
+
|
|
|
+ override fun serialPortBedOnclick(buffer: ByteArray) {
|
|
|
+ Log.d("serialPortBedOnclick", "buffer[0]:" + buffer[0] + ", buffer[1]:" + buffer[1] + ", buffer[2]:" + buffer[2]
|
|
|
+ + ", buffer[3]:" + buffer[3] + ", buffer[4]:" + buffer[4] + ", buffer[5]:" + buffer[5] + ", buffer[6]:" + buffer[6]
|
|
|
+ + ", buffer[7]:" + buffer[7] + ", buffer[8]:" + buffer[8])
|
|
|
+ if (buffer[5].toInt() == 1 || buffer[5].toInt() == 2) {
|
|
|
+ //面板呼叫键
|
|
|
+ runOnUiThread {
|
|
|
+ if (Constant.CALL_STATE == Constant.CALL_STANDBY) {
|
|
|
+ if (!TextUtils.isEmpty(Constant.SIP_ID)) {
|
|
|
+ startCall(Constant.VOICE_CALL)
|
|
|
+ } else {
|
|
|
+ showMessage("当前设备可能未办理入住,不能呼叫")
|
|
|
+ }
|
|
|
+ } else if (Constant.CALL_STATE == Constant.CALL_INCOMING) {
|
|
|
+ //来电接听
|
|
|
+ EventBus.getDefault().post(MessageEvent("accept", Constant.EVENT_SERIAL_EVENT))
|
|
|
+ }
|
|
|
+ }
|
|
|
+ } else if (buffer[8].toInt() == 1 || buffer[8].toInt() == 2) {
|
|
|
+ //面板挂断键
|
|
|
+ runOnUiThread {
|
|
|
+ if (Constant.CALL_STATE == Constant.CALL_CALLING) {
|
|
|
+ //通话中挂断
|
|
|
+ EventBus.getDefault().post(MessageEvent("handoff", Constant.EVENT_SERIAL_EVENT))
|
|
|
+ } else if (Constant.CALL_STATE == Constant.CALL_OUTGOING) {
|
|
|
+ //呼叫取消
|
|
|
+ EventBus.getDefault().post(MessageEvent("cancel", Constant.EVENT_SERIAL_EVENT))
|
|
|
+ } else if (Constant.CALL_STATE == Constant.CALL_INCOMING) {
|
|
|
+ //来电拒接
|
|
|
+ EventBus.getDefault().post(MessageEvent("reject", Constant.EVENT_SERIAL_EVENT))
|
|
|
+ }
|
|
|
+ }
|
|
|
+ } else if (buffer[6].toInt() == 1 || buffer[6].toInt() == 2) {
|
|
|
+ //手柄按键
|
|
|
+ runOnUiThread {
|
|
|
+ if (Constant.CALL_STATE == Constant.CALL_STANDBY) {
|
|
|
+ if (!TextUtils.isEmpty(Constant.SIP_ID)) {
|
|
|
+ startCall(Constant.VOICE_CALL)
|
|
|
+ } else {
|
|
|
+ showMessage("当前设备可能未办理入住,不能呼叫")
|
|
|
+ }
|
|
|
+ } else if (Constant.CALL_STATE == Constant.CALL_INCOMING) {
|
|
|
+ //来电接听
|
|
|
+ EventBus.getDefault().post(MessageEvent("accept", Constant.EVENT_SERIAL_EVENT))
|
|
|
+ } else if (Constant.CALL_STATE == Constant.CALL_CALLING) {
|
|
|
+ //通话中挂断
|
|
|
+ EventBus.getDefault().post(MessageEvent("handoff", Constant.EVENT_SERIAL_EVENT))
|
|
|
+ }
|
|
|
+ }
|
|
|
+ } else if (buffer[7].toInt() == 1 || buffer[7].toInt() == 2) {
|
|
|
+ //卫生间紧急按钮: 一定时间内重复多次按无效
|
|
|
+ if (System.currentTimeMillis() - clickSosTime > 10000) {
|
|
|
+ runOnUiThread {
|
|
|
+ clickSosTime = System.currentTimeMillis()
|
|
|
+ SOSHelper.sosStart()
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ override fun serialPortBedOnclickString(str: String) {
|
|
|
+ try {
|
|
|
+ val newStr = str.substring(str.indexOf("$") + 1, str.indexOf("#"))
|
|
|
+ Log.d("serialPortBedOnclickString", "newStr==$newStr")
|
|
|
+ if (newStr.startsWith("V")) {
|
|
|
+ Constant.MCU_VERSION_NUMBER = newStr.substring(newStr.indexOf(",") + 1, 16)
|
|
|
+ }
|
|
|
+ } catch (e: Exception) {
|
|
|
+ e.printStackTrace()
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ //开始呼叫
|
|
|
+ fun startCall(type: Int) {
|
|
|
+ //通话之前先判断webrtc socket和tcp是否连接正常,否则不能建立通话
|
|
|
+ if (SocketManager.getInstance().socketOpen() && Constant.TCP_CONNECTED) {
|
|
|
+ //去电界面
|
|
|
+ Constant.CALL_TYPE = type
|
|
|
+ Constant.CALL_STATE = Constant.CALL_OUTGOING
|
|
|
+ var fragment = SkyCallFragment()
|
|
|
+ var bundle = Bundle()
|
|
|
+ bundle.putInt("call_state", 0)
|
|
|
+ fragment.arguments = bundle
|
|
|
+ addCallFragment(fragment)
|
|
|
+ } else {
|
|
|
+ showMessage("通话服务或网络未连接,请检查网络稍后再试")
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ @Subscribe(threadMode = ThreadMode.MAIN)
|
|
|
+ fun onMoonEvent(messageEvent: MessageEvent) {
|
|
|
+ //代码同步
|
|
|
+ synchronized(Unit) {
|
|
|
+ handleTcpModel(messageEvent)
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ fun handleTcpModel(messageEvent: MessageEvent) {
|
|
|
+ when (messageEvent.getType()) {
|
|
|
+ //退出通话界面
|
|
|
+ Constant.EVENT_REMOVE_CALL_FRAGMENT -> {
|
|
|
+ if (skyCallFragment != null) {
|
|
|
+ Constant.CALL_STATE = Constant.CALL_STANDBY
|
|
|
+ SerialPortHelper.setCallStatus("0")
|
|
|
+ removeCallFragment()
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ //Sip注册状态
|
|
|
+ Constant.EVENT_SIP_REGISTER_STATUS -> {
|
|
|
+ if (messageEvent.message is String) run {
|
|
|
+ val status = messageEvent.message as String
|
|
|
+ Log.d("sip", "sip regist status: " + status)
|
|
|
+ updateStatus(status)
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ //网络ping状态
|
|
|
+ /*Constant.EVENT_INTERNETPING -> {
|
|
|
+ if (NetHelper.NetConn && NetHelper.getInstance().getNetworkType() == ConnectivityManager.TYPE_ETHERNET) {
|
|
|
+ view_title_layout_iv_ethernet.setImageResource(R.mipmap.ic_etherneted)
|
|
|
+ } else {
|
|
|
+ view_title_layout_iv_ethernet.setImageResource(R.mipmap.ic_no_ethernet)
|
|
|
+ }
|
|
|
+ view_title_layout_iv_wifi.setImageResource(R.mipmap.ic_wifi_nor)
|
|
|
+ }*/
|
|
|
+
|
|
|
+ //TCP消息处理
|
|
|
+ Constant.EVENT_TCP_MSG -> {
|
|
|
+ if (messageEvent.message is TcpModel) {
|
|
|
+ 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.CALL_STATE = Constant.CALL_INCOMING
|
|
|
+ //通话之前先判断webrtc socket是否连接上,否则不能建立通话
|
|
|
+ if (SocketManager.getInstance().socketOpen()) {
|
|
|
+ //来电界面
|
|
|
+ var fragment = SkyCallFragment()
|
|
|
+ var bundle = Bundle()
|
|
|
+ bundle.putInt("call_state", 1)
|
|
|
+ bundle.putSerializable("tcp_model", tcpModel)
|
|
|
+ fragment.arguments = bundle
|
|
|
+ addCallFragment(fragment)
|
|
|
+ } else {
|
|
|
+ showMessage("通话服务还未建立连接,请稍后")
|
|
|
+ Constant.CALL_STATE = Constant.CALL_STANDBY
|
|
|
+ VoiceUtil.rejectAudioCall(Constant.DEVICE_ID, Constant.fromId, Constant.interactionId)
|
|
|
+ }
|
|
|
+ }
|
|
|
+ } else if (tcpModel.type == TcpType.SOS) {
|
|
|
+ if (tcpModel.action == TcpAction.SOSAction.CANCEL) {
|
|
|
+ //紧急呼叫已处理
|
|
|
+ SOSHelper.sosStop()
|
|
|
+ }
|
|
|
+ } else if (tcpModel.type == TcpType.DEVICE) {
|
|
|
+ //检查APP版本
|
|
|
+ if (tcpModel.getAction() == TcpAction.DeviceAction.APP_UPDATE) {
|
|
|
+ checkAppVersion()
|
|
|
+ }
|
|
|
+ } else if (tcpModel.action == TcpAction.DataAction.REFRESH) {
|
|
|
+ //重新加载数据,比如出院,入院等
|
|
|
+ initDevice()
|
|
|
+ }
|
|
|
+
|
|
|
+ //探视
|
|
|
+ if (tcpModel.type == TcpType.VIDEO) {
|
|
|
+ val interactionVO = Gson().fromJson(tcpModel.data.toString(), InteractionVO::class.java)
|
|
|
+ if (tcpModel.action == TcpAction.VideoAction.VIDEO_INVITE_JOIN) {
|
|
|
+ if (Constant.CALL_STATE != Constant.CALL_STANDBY) {
|
|
|
+ VideoUtil.videoInCalling(Constant.DEVICE_ID, tcpModel.fromId, interactionVO.id)
|
|
|
+ } else {
|
|
|
+ //收到探视请求,向探视机发起视频通话
|
|
|
+ Constant.interactionId = interactionVO.id
|
|
|
+ Constant.fromId = tcpModel.fromId
|
|
|
+ Constant.CALL_STATE = Constant.CALL_OUTGOING
|
|
|
+
|
|
|
+ //通话之前先判断webrtc socket是否连接上,否则不能建立通话
|
|
|
+ if (SocketManager.getInstance().socketOpen()) {
|
|
|
+ //探视界面
|
|
|
+ var fragment = SkyCallFragment()
|
|
|
+ var bundle = Bundle()
|
|
|
+ bundle.putInt("call_state", 2)
|
|
|
+ bundle.putSerializable("tcp_model", tcpModel)
|
|
|
+ fragment.arguments = bundle
|
|
|
+ addCallFragment(fragment)
|
|
|
+ } else {
|
|
|
+ showMessage("通话服务还未建立连接,请稍后")
|
|
|
+ Constant.CALL_STATE = Constant.CALL_STANDBY
|
|
|
+ VoiceUtil.rejectAudioCall(Constant.DEVICE_ID, Constant.fromId, Constant.interactionId)
|
|
|
+ }
|
|
|
+ }
|
|
|
+ } else if (tcpModel.action == TcpAction.VideoAction.HANDOFF) {
|
|
|
+ Constant.CALL_STATE = Constant.CALL_STANDBY
|
|
|
+ SerialPortHelper.setCallStatus("0")
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ //TCP连接状态
|
|
|
+ Constant.EVENT_TCP_STATE -> {
|
|
|
+ updateTcpState()
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ private fun updateStatus(state: String) {
|
|
|
+ this.runOnUiThread {
|
|
|
+ when (state) {
|
|
|
+ SipStatus.REGISTERING -> {
|
|
|
+ view_title_layout_tv_point.setBackgroundResource(R.color.yellow_color)
|
|
|
+ }
|
|
|
+ SipStatus.REGISTERFAIL -> {
|
|
|
+ view_title_layout_tv_point.setBackgroundResource(R.color.red_color)
|
|
|
+ }
|
|
|
+ SipStatus.REGISTERCOM -> {
|
|
|
+ view_title_layout_tv_point.setBackgroundResource(R.color.green)
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ private fun updateNetState() {
|
|
|
+ if (NetHelper.getInstance().networkType == ConnectivityManager.TYPE_WIFI) {
|
|
|
+ view_title_layout_iv_wifi.visibility = View.VISIBLE
|
|
|
+ view_title_layout_iv_wifi.setImageResource(R.mipmap.ic_wifi_success)
|
|
|
+ view_title_layout_iv_ethernet.visibility = View.GONE
|
|
|
+ } else if (NetHelper.getInstance().networkType == ConnectivityManager.TYPE_ETHERNET) {
|
|
|
+ view_title_layout_iv_ethernet.visibility = View.VISIBLE
|
|
|
+ view_title_layout_iv_ethernet.setImageResource(R.mipmap.ic_ethernet_success)
|
|
|
+ view_title_layout_iv_wifi.visibility = View.GONE
|
|
|
+ }
|
|
|
+
|
|
|
+ /*if (NetHelper.isBTConnected()) {
|
|
|
+ view_title_layout_iv_bt.visibility = View.VISIBLE
|
|
|
+ view_title_layout_iv_bt.setImageResource(R.mipmap.ic_bt_success)
|
|
|
+ } else {
|
|
|
+ view_title_layout_iv_bt.visibility = View.GONE
|
|
|
+ }*/
|
|
|
+
|
|
|
+ /*
|
|
|
+ * 检查网络情况,若tcp断开连接多次且IP也是空的则网络异常,重启设备
|
|
|
+ * 仅对3128设备有效
|
|
|
+ */
|
|
|
+ if (Build.MODEL.equals("rk3128")) {
|
|
|
+ var count = SettingConfig.getNetErrResetCount(this)
|
|
|
+ if (!Constant.TCP_CONNECTED && TextUtils.isEmpty(NetHelper.getInstance().localIP)) {
|
|
|
+ netErrCount++
|
|
|
+ } else {
|
|
|
+ netErrCount = 0
|
|
|
+ if (count > 0) {
|
|
|
+ count = 0
|
|
|
+ SettingConfig.setNetErrResetCount(this, count)
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ if (netErrCount >= 5) {
|
|
|
+ //如果重启次数超过8次还是无网则不再重启
|
|
|
+ if (count < 8) {
|
|
|
+ count++
|
|
|
+ SettingConfig.setNetErrResetCount(this, count)
|
|
|
+ Handler().postDelayed({
|
|
|
+ AppUpdateHelper.reboot(this)
|
|
|
+ }, 5000)
|
|
|
+ } else {
|
|
|
+ WarningDialogHelper.showDialog(this@Callingbed2Activity)
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ private fun updateTcpState() {
|
|
|
+ if (Constant.TCP_CONNECTED) {
|
|
|
+ view_title_layout_iv_tcp.setImageResource(R.mipmap.ic_tcp_success)
|
|
|
+ if (SocketManager.getInstance().userState == 0) {
|
|
|
+ //如果socket断开了则重连
|
|
|
+ connectSocket()
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ view_title_layout_iv_tcp.setImageResource(R.mipmap.ic_tcp_fail)
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ private fun updateSettings() {
|
|
|
+ val currentTimestamp = System.currentTimeMillis()
|
|
|
+
|
|
|
+ //白天起始时间戳
|
|
|
+ var date = TimeHandle.getDateTime("yyyy-MM-dd")
|
|
|
+ var dayStartTimeStamp = TimeHandle.dateToStamp(date+" "+SettingConfig.getInitialDayTime(this)+":00", "yyyy-MM-dd HH:mm:ss")
|
|
|
+ //白天结束时间戳
|
|
|
+ var endOfDayTimeStamp = TimeHandle.dateToStamp(date+" "+SettingConfig.getEndOfDay(this)+":00", "yyyy-MM-dd HH:mm:ss")
|
|
|
+
|
|
|
+ //白天
|
|
|
+ if (dayStartTimeStamp < currentTimestamp && currentTimestamp < endOfDayTimeStamp) {
|
|
|
+ //设置白天亮度
|
|
|
+ ScreenManagerUtil().setScreenBrightness(this, Math.ceil(2.54 * SettingConfig.getExtensionDaytimeBrightness(this)).toInt())
|
|
|
+ //设置白天系统音量和响铃音
|
|
|
+ VoiceManagerUtil.setSystemVoice(this, SettingConfig.getExtensionDaytimeSystemVolume(this))
|
|
|
+ VoiceManagerUtil.setMusicVoice(this, SettingConfig.getExtensionDaytimeSystemVolume(this))
|
|
|
+ view_title_layout_iv_day_night.setImageResource(R.mipmap.ic_daylight)
|
|
|
+ Constant.inday = true
|
|
|
+ } else { //夜晚
|
|
|
+ //设置晚上亮度
|
|
|
+ ScreenManagerUtil().setScreenBrightness(this, Math.ceil(2.54 * SettingConfig.getExtensionNightBrightness(this)).toInt())
|
|
|
+ //设置晚上系统音量和响铃音
|
|
|
+ VoiceManagerUtil.setSystemVoice(this, SettingConfig.getExtensionNightSystemVolume(this))
|
|
|
+ VoiceManagerUtil.setMusicVoice(this, SettingConfig.getExtensionNightSystemVolume(this))
|
|
|
+ view_title_layout_iv_day_night.setImageResource(R.mipmap.ic_night)
|
|
|
+ Constant.inday = false
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ inner class TimeReceiver: BroadcastReceiver() {
|
|
|
+ override fun onReceive(context: Context, intent: Intent) {
|
|
|
+ if (intent.action == Intent.ACTION_TIME_TICK
|
|
|
+ || intent.action == Intent.ACTION_TIME_CHANGED
|
|
|
+ || intent.action == Intent.ACTION_TIMEZONE_CHANGED) {
|
|
|
+ updateNetState()
|
|
|
+ updateSettings()
|
|
|
+ updateTcpState()
|
|
|
+
|
|
|
+ if (SocketManager.getInstance().userState == 1) {
|
|
|
+ view_title_layout_tv_point.setBackgroundResource(R.color.green)
|
|
|
+ } else {
|
|
|
+ view_title_layout_tv_point.setBackgroundResource(R.color.red_color)
|
|
|
+ }
|
|
|
+ } else if (intent.action == ConnectivityManager.CONNECTIVITY_ACTION) {
|
|
|
+ updateNetState()
|
|
|
+ if (NetHelper.getInstance().networkAvailable()) {
|
|
|
+ if (!Constant.TCP_CONNECTED) {
|
|
|
+ TcpClient.getInstance().doConnect()
|
|
|
+ }
|
|
|
+ if (SocketManager.getInstance().userState == 0) {
|
|
|
+ //如果socket断开了则重连
|
|
|
+ connectSocket()
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+}
|