Quellcode durchsuchen

优化紧急呼叫弹窗显示,优化左侧交互记录显示

weizhengliang vor 3 Jahren
Ursprung
Commit
8e6dceb81e

+ 296 - 61
middleware/src/main/code/com/wdkl/ncs/android/middleware/model/vo/InteractionVO.java

@@ -1,7 +1,11 @@
 package com.wdkl.ncs.android.middleware.model.vo;
 
+import com.fasterxml.jackson.databind.PropertyNamingStrategy;
+import com.fasterxml.jackson.databind.annotation.JsonNaming;
 import com.wdkl.ncs.android.middleware.model.annotation.Column;
-import com.wdkl.ncs.android.middleware.model.dos.InteractionDO;
+import com.wdkl.ncs.android.middleware.model.annotation.Id;
+
+import java.io.Serializable;
 
 import io.swagger.annotations.ApiModelProperty;
 
@@ -11,8 +15,110 @@ import io.swagger.annotations.ApiModelProperty;
  * @author: Vothin
  * @create: 2021/04/02 15:27
  */
-
-public class InteractionVO extends InteractionDO {
+@JsonNaming(value = PropertyNamingStrategy.SnakeCaseStrategy.class)
+public class InteractionVO implements Serializable {
+
+    /**
+     * id
+     */
+    @Column(name = "id")
+    @ApiModelProperty(value = "id", required = false)
+    @Id(name = "id")
+    private Integer id;
+    /**
+     * 创建时间
+     */
+    @Column(name = "create_date")
+    @ApiModelProperty(value = "创建时间", required = false)
+    private Long createDate;
+    /**
+     * 科室Id
+     */
+    @Column(name = "part_id")
+    @ApiModelProperty(value = "科室Id", required = false)
+    private Integer partId;
+    /**
+     * 交互类型(1:语音通话,2:视频通话,3:卫生间紧急呼叫,4:语音留言,5:文本消息,6:按键事件)
+     */
+    @Column(name = "action_type")
+    @ApiModelProperty(value = "交互类型(1:语音通话,2:视频通话,3:卫生间紧急呼叫,4:语音留言,5:文本消息,6:按键事件)", required = false)
+    private String actionType;
+    /**
+     * SUCCESS、FAILED
+     */
+    @Column(name = "action_result")
+    @ApiModelProperty(value = "0失败,1成功", required = false)
+    private Integer actionResult;
+    /**
+     * 交互发起设备Id
+     */
+    @Column(name = "from_device_id")
+    @ApiModelProperty(value = "交互发起设备Id", required = false)
+    private Integer fromDeviceId;
+    /**
+     * 交互对象设备Id
+     */
+    @Column(name = "to_device_id")
+    @ApiModelProperty(value = "交互对象设备Id", required = false)
+    private Integer toDeviceId;
+    /**
+     * 发起设备所在空间结构
+     */
+    @Column(name = "from_device_frame_id")
+    @ApiModelProperty(value = "发起设备所在空间结构", required = false)
+    private Integer fromDeviceFrameId;
+    /**
+     * 交互对象所在空间结果
+     */
+    @Column(name = "to_device_frame_id")
+    @ApiModelProperty(value = "交互对象所在空间结果", required = false)
+    private Integer toDeviceFrameId;
+    /**
+     * 交互发起设备使用者member_id
+     */
+    @Column(name = "from_device_member_id")
+    @ApiModelProperty(value = "交互发起设备使用者member_id", required = false)
+    private Integer fromDeviceMemberId;
+    /**
+     * 交互对象设备使用者member_id
+     */
+    @Column(name = "to_device_member_id")
+    @ApiModelProperty(value = "交互对象设备使用者member_id", required = false)
+    private Integer toDeviceMemberId;
+    /**
+     * 交互开始时间(通话时指通话接通时间,与create_time相同)
+     */
+    @Column(name = "action_start")
+    @ApiModelProperty(value = "交互开始时间(通话时指通话接通时间,与create_time相同)", required = false)
+    private Long actionStart;
+    /**
+     * 应答时间
+     */
+    @Column(name = "action_accept")
+    @ApiModelProperty(value = "应答时间", required = false)
+    private Long actionAccept;
+    /**
+     * 交互结束时间(通话时指通话挂断时间,通话挂断后要更新此字段)。事件响应时间、语音已读时间
+     */
+    @Column(name = "action_end")
+    @ApiModelProperty(value = "交互结束时间(通话时指通话挂断时间,通话挂断后要更新此字段)。事件响应时间、语音已读时间", required = false)
+    private Long actionEnd;
+    /**
+     * 交互处理者的member_id
+     */
+    @Column(name = "action_end_member_id")
+    @ApiModelProperty(value = "交互处理者的member_id", required = false)
+    private Integer actionEndMemberId;
+    /**
+     * 交互数据(类型1,2,3为空)(类型4为音频文件地址)(5为文本内容)(类型6为具体按键类型)
+     */
+    @Column(name = "data")
+    @ApiModelProperty(value = "交互数据(类型1,2,3为空)(类型4为音频文件地址)(5为文本内容)(类型6为具体按键类型)", required = false)
+    private String data;
+
+    @Column(name = "action_direction_type")
+    @ApiModelProperty(value = "交互方向类型(1:分机到主机、腕表、医生机,2:主机、腕表、医生机到分机,3主机、腕表、医生机之间互通,4:分机到分机)",required = false)
+    private Integer actionDirectionType;
 
     /** 用户 **/
     @Column(name = "from_customer_id")
@@ -75,6 +181,10 @@ public class InteractionVO extends InteractionDO {
     @ApiModelProperty(value = "发起端设备的设备类型", required = false)
     private Integer fromDeviceType;
 
+    @Column(name = "from_device_name")
+    @ApiModelProperty(value = "发起端设备的名称", required = false)
+    private String fromDeviceName;
+
 
     @Column(name = "to_eth_mac")
     @ApiModelProperty(value = "目的端设备的有线以太网卡MAC地址", required = false)
@@ -93,6 +203,12 @@ public class InteractionVO extends InteractionDO {
     @ApiModelProperty(value = "目的端设备的设备类型", required = false)
     private Integer toDeviceType;
 
+
+    @Column(name = "to_device_name")
+    @ApiModelProperty(value = "目的端设备的名称", required = false)
+    private String toDeviceName;
+
+
     /** 空间结构 **/
 
     @Column(name = "from_frame_type")
@@ -131,10 +247,148 @@ public class InteractionVO extends InteractionDO {
     @ApiModelProperty(value = "外部来电时,from_member亲属关系", required = false)
     private String relativeName;
 
-    @Column(name = "outerior_action_name")
-    @ApiModelProperty(value = "外部来电时,from_member亲属名字", required = false)
-    private String outeriorActionName;
+    @Column(name = "action_end_member_name")
+    @ApiModelProperty(value = "交互处理者的用户姓名", required = false)
+    private String actionEndMemberName;
+
+
+
+
+    public Integer getId() {
+        return id;
+    }
+
+    public void setId(Integer id) {
+        this.id = id;
+    }
+
+    public Long getCreateDate() {
+        return createDate;
+    }
+
+    public void setCreateDate(Long createDate) {
+        this.createDate = createDate;
+    }
+
+    public Integer getPartId() {
+        return partId;
+    }
+
+    public void setPartId(Integer partId) {
+        this.partId = partId;
+    }
+
+    public String getActionType() {
+        return actionType;
+    }
+
+    public void setActionType(String actionType) {
+        this.actionType = actionType;
+    }
+
+    public Integer getActionResult() {
+        return actionResult;
+    }
+
+    public void setActionResult(Integer actionResult) {
+        this.actionResult = actionResult;
+    }
+
+    public Integer getFromDeviceId() {
+        return fromDeviceId;
+    }
+
+    public void setFromDeviceId(Integer fromDeviceId) {
+        this.fromDeviceId = fromDeviceId;
+    }
+
+    public Integer getToDeviceId() {
+        return toDeviceId;
+    }
+
+    public void setToDeviceId(Integer toDeviceId) {
+        this.toDeviceId = toDeviceId;
+    }
+
+    public Integer getFromDeviceFrameId() {
+        return fromDeviceFrameId;
+    }
+
+    public void setFromDeviceFrameId(Integer fromDeviceFrameId) {
+        this.fromDeviceFrameId = fromDeviceFrameId;
+    }
+
+    public Integer getToDeviceFrameId() {
+        return toDeviceFrameId;
+    }
+
+    public void setToDeviceFrameId(Integer toDeviceFrameId) {
+        this.toDeviceFrameId = toDeviceFrameId;
+    }
+
+    public Integer getFromDeviceMemberId() {
+        return fromDeviceMemberId;
+    }
+
+    public void setFromDeviceMemberId(Integer fromDeviceMemberId) {
+        this.fromDeviceMemberId = fromDeviceMemberId;
+    }
+
+    public Integer getToDeviceMemberId() {
+        return toDeviceMemberId;
+    }
+
+    public void setToDeviceMemberId(Integer toDeviceMemberId) {
+        this.toDeviceMemberId = toDeviceMemberId;
+    }
+
+    public Long getActionStart() {
+        return actionStart;
+    }
+
+    public void setActionStart(Long actionStart) {
+        this.actionStart = actionStart;
+    }
+
+    public Long getActionAccept() {
+        return actionAccept;
+    }
+
+    public void setActionAccept(Long actionAccept) {
+        this.actionAccept = actionAccept;
+    }
+
+    public Long getActionEnd() {
+        return actionEnd;
+    }
+
+    public void setActionEnd(Long actionEnd) {
+        this.actionEnd = actionEnd;
+    }
+
+    public Integer getActionEndMemberId() {
+        return actionEndMemberId;
+    }
+
+    public void setActionEndMemberId(Integer actionEndMemberId) {
+        this.actionEndMemberId = actionEndMemberId;
+    }
+
+    public String getData() {
+        return data;
+    }
+
+    public void setData(String data) {
+        this.data = data;
+    }
+
+    public Integer getActionDirectionType() {
+        return actionDirectionType;
+    }
 
+    public void setActionDirectionType(Integer actionDirectionType) {
+        this.actionDirectionType = actionDirectionType;
+    }
 
     public Integer getFromCustomerId() {
         return fromCustomerId;
@@ -240,6 +494,22 @@ public class InteractionVO extends InteractionDO {
         this.fromSipId = fromSipId;
     }
 
+    public Integer getFromDeviceType() {
+        return fromDeviceType;
+    }
+
+    public void setFromDeviceType(Integer fromDeviceType) {
+        this.fromDeviceType = fromDeviceType;
+    }
+
+    public String getFromDeviceName() {
+        return fromDeviceName;
+    }
+
+    public void setFromDeviceName(String fromDeviceName) {
+        this.fromDeviceName = fromDeviceName;
+    }
+
     public String getToEthMac() {
         return toEthMac;
     }
@@ -264,6 +534,22 @@ public class InteractionVO extends InteractionDO {
         this.toSipId = toSipId;
     }
 
+    public Integer getToDeviceType() {
+        return toDeviceType;
+    }
+
+    public void setToDeviceType(Integer toDeviceType) {
+        this.toDeviceType = toDeviceType;
+    }
+
+    public String getToDeviceName() {
+        return toDeviceName;
+    }
+
+    public void setToDeviceName(String toDeviceName) {
+        this.toDeviceName = toDeviceName;
+    }
+
     public Integer getFromFrameType() {
         return fromFrameType;
     }
@@ -328,62 +614,11 @@ public class InteractionVO extends InteractionDO {
         this.relativeName = relativeName;
     }
 
-    public String getOuteriorActionName() {
-        return outeriorActionName;
-    }
-
-    public void setOuteriorActionName(String outeriorActionName) {
-        this.outeriorActionName = outeriorActionName;
-    }
-
-    public Integer getFromDeviceType() {
-        return fromDeviceType;
-    }
-
-    public void setFromDeviceType(Integer fromDeviceType) {
-        this.fromDeviceType = fromDeviceType;
+    public String getActionEndMemberName() {
+        return actionEndMemberName;
     }
 
-    public Integer getToDeviceType() {
-        return toDeviceType;
-    }
-
-    public void setToDeviceType(Integer toDeviceType) {
-        this.toDeviceType = toDeviceType;
-    }
-
-    @Override
-    public String toString() {
-        return "InteractionVO{" +
-                "fromCustomerId=" + fromCustomerId +
-                ", fromMemberName='" + fromMemberName + '\'' +
-                ", fromMemberFace='" + fromMemberFace + '\'' +
-                ", fromClerkId=" + fromClerkId +
-                ", fromRoleName='" + fromRoleName + '\'' +
-                ", toCustomerId=" + toCustomerId +
-                ", toMemberName='" + toMemberName + '\'' +
-                ", toMemberFace='" + toMemberFace + '\'' +
-                ", toClerkId=" + toClerkId +
-                ", toRoleName='" + toRoleName + '\'' +
-                ", fromEthMac='" + fromEthMac + '\'' +
-                ", fromEthIp='" + fromEthIp + '\'' +
-                ", fromSipId='" + fromSipId + '\'' +
-                ", fromDeviceType='" + fromDeviceType + '\'' +
-                ", toEthMac='" + toEthMac + '\'' +
-                ", toEthIp='" + toEthIp + '\'' +
-                ", toSipId='" + toSipId + '\'' +
-                ", toDeviceType='" + toDeviceType + '\'' +
-                ", fromFrameType=" + fromFrameType +
-                ", fromFrameName='" + fromFrameName + '\'' +
-                ", fromFrameFullName='" + fromFrameFullName + '\'' +
-                ", toFrameType=" + toFrameType +
-                ", toFrameName='" + toFrameName + '\'' +
-                ", toFrameFullName='" + toFrameFullName + '\'' +
-                ", relativeId=" + relativeId +
-                ", relativeName='" + relativeName + '\'' +
-                ", outeriorActionName='" + outeriorActionName + '\'' +
-                '}';
+    public void setActionEndMemberName(String actionEndMemberName) {
+        this.actionEndMemberName = actionEndMemberName;
     }
 }
-
-

+ 36 - 16
nursehome/src/main/java/com/wdkl/ncs/android/component/nursehome/activity/NurseHomeActivity.kt

@@ -35,6 +35,7 @@ import com.wdkl.ncs.android.component.nursehome.fragment.*
 import com.wdkl.ncs.android.component.nursehome.launch.NurseHomeLaunch
 import com.wdkl.ncs.android.component.nursehome.settingconfig.SettingConfig
 import com.wdkl.ncs.android.component.nursehome.util.*
+import com.wdkl.ncs.android.component.nursehome.window.IncidentWindow
 import com.wdkl.ncs.android.lib.base.BaseActivity
 import com.wdkl.ncs.android.lib.utils.AppTool
 import com.wdkl.ncs.android.lib.utils.push
@@ -93,6 +94,9 @@ class NurseHomeActivity  : BaseActivity<NurseHomeActivityPresenter, ActivityNurs
     lateinit var transferCountDownTimer: CountDownTimer
     var transferVo: InteractionVO? = null
 
+    //事件提醒window
+    private var incidentWindow: IncidentWindow? = null
+
     //呼叫对方设备id
     var callTargetId: Int? = -1
 
@@ -156,6 +160,9 @@ class NurseHomeActivity  : BaseActivity<NurseHomeActivityPresenter, ActivityNurs
         updateTime(true)
 
         SpeechUtil.getInstance().init(this)
+
+        //初始化事件提醒window
+        incidentWindow = IncidentWindow(this.activity)
     }
 
     private fun connectSocket() {
@@ -971,29 +978,20 @@ class NurseHomeActivity  : BaseActivity<NurseHomeActivityPresenter, ActivityNurs
                         DeviceChannel.calling = true
                         CallDialogHelper.dismissCallDialog()
 
-                        val sosRoom = interactionVO.fromFrameFullName.substringBefore("-")
-                        if (Constants.CALL_STATE != Constants.CALL_SOS) {
-                            SOSDialog.build(this).configShow(sosCancel = {
-                                Constants.CALL_STATE = Constants.CALL_STANDBY
-                                DeviceChannel.calling = false
-                                OtherUtil.cancelSosCall(Constants.ids, interactionVO.fromDeviceId, interactionVO.id)
-                                EventBus.getDefault().post(MessageEvent(0, Constants.EVENT_REFRESH_CALL_LIST))
-
-                                if (SettingConfig.getTtsMode(activity) == SettingConfig.TTS_OFF) {
-                                    RingPlayHelper.stopRingTone()
-                                } else {
-                                    SpeechUtil.getInstance().stopSpeak()
-                                }
-                            }, sosText = sosRoom + "紧急呼叫")
+                        showSosAlert(interactionVO, false)
+
+                        var sosName = interactionVO.fromFrameFullName.substringBefore("-")
+                        //如果分机绑定了紧急按钮则加上紧急按钮名称
+                        if (interactionVO.fromDeviceType == 21 || interactionVO.fromDeviceType == 13) {
+                            sosName += interactionVO.fromDeviceName
                         }
 
                         //语音
                         if (SettingConfig.getTtsMode(activity) == SettingConfig.TTS_OFF) {
                             RingPlayHelper.playRingTone(activity, R.raw.sos2, false)
                         } else {
-                            SpeechUtil.getInstance().addSpeech(sosRoom + "紧急呼叫", true)
+                            SpeechUtil.getInstance().addSpeech(sosName + "紧急呼叫", true)
                         }
-                        Constants.CALL_STATE = Constants.CALL_SOS
 
                         EventBus.getDefault().post(MessageEvent(0, Constants.EVENT_REFRESH_CALL_LIST))
                     }
@@ -1071,6 +1069,10 @@ class NurseHomeActivity  : BaseActivity<NurseHomeActivityPresenter, ActivityNurs
                             Constants.laterRestart = true
                         }
                     }
+                } else if (tcpModel.type == TcpType.DATA) {
+                    if (tcpModel.action == TcpAction.DataAction.INTERACTION) {
+                        EventBus.getDefault().post(MessageEvent(0, Constants.EVENT_REFRESH_CALL_LIST))
+                    }
                 }
             }
 
@@ -1126,6 +1128,24 @@ class NurseHomeActivity  : BaseActivity<NurseHomeActivityPresenter, ActivityNurs
 
     }
 
+    fun showSosAlert(item: InteractionVO, newWindow: Boolean) {
+        if (incidentWindow!!.view == null) {
+            incidentWindow?.createFloatView(item)
+        } else {
+            if (newWindow) {
+                incidentWindow?.release()
+            }
+            incidentWindow?.createFloatView(item)
+        }
+    }
+
+    fun declineSosItem(item:InteractionVO){
+        if(incidentWindow!!.view==null){
+            return
+        }else{
+            incidentWindow?.declineItem(item)
+        }
+    }
 
 }
 

+ 10 - 2
nursehome/src/main/java/com/wdkl/ncs/android/component/nursehome/adapter/CallRecordsItemAdapter.kt

@@ -86,7 +86,11 @@ class CallRecordsItemAdapter(val data:ArrayList<InteractionVO>) : BaseDelegateAd
 
                 if (TcpType.SOS.name == itemData.actionType) {
                     //紧急呼叫已处理: 因为紧急按钮是连接在某个分机上,所以收到的紧急呼叫信息会携带该分机的信息,实际需要显示的是该房间的信息
-                    val roomNo = itemData.fromFrameFullName.substringBefore("-")
+                    var roomNo = itemData.fromFrameFullName.substringBefore("-")
+                    //如果分机绑定了紧急按钮则加上紧急按钮名称
+                    if (itemData.fromDeviceType == 21 || itemData.fromDeviceType == 13) {
+                        roomNo += itemData.fromDeviceName
+                    }
                     binding.sickbedTv.text = roomNo
                     binding.nameTv.text = "紧急呼叫"
                     binding.callStatusImagev.visibility = View.GONE
@@ -110,7 +114,11 @@ class CallRecordsItemAdapter(val data:ArrayList<InteractionVO>) : BaseDelegateAd
             } else {
                 if (TcpType.SOS.name == itemData.actionType) {
                     //紧急呼叫未处理
-                    val roomNo = itemData.fromFrameFullName.substringBefore("-")
+                    var roomNo = itemData.fromFrameFullName.substringBefore("-")
+                    //如果分机绑定了紧急按钮则加上紧急按钮名称
+                    if (itemData.fromDeviceType == 21 || itemData.fromDeviceType == 13) {
+                        roomNo += itemData.fromDeviceName
+                    }
                     binding.sickbedTv.text = roomNo
                     binding.nameTv.text = "紧急呼叫"
                     binding.callStatusImagev.visibility = View.GONE

+ 224 - 0
nursehome/src/main/java/com/wdkl/ncs/android/component/nursehome/window/IncidentWindow.kt

@@ -0,0 +1,224 @@
+package com.wdkl.ncs.android.component.nursehome.window
+
+import android.content.Context
+import android.databinding.DataBindingUtil
+import android.graphics.PixelFormat
+import android.os.Build
+import android.text.TextUtils
+import android.util.Log
+import android.view.*
+import android.view.animation.AlphaAnimation
+import android.view.animation.Animation
+import android.view.animation.LinearInterpolator
+import com.alibaba.android.vlayout.DelegateAdapter
+import com.alibaba.android.vlayout.LayoutHelper
+import com.alibaba.android.vlayout.VirtualLayoutManager
+import com.alibaba.android.vlayout.layout.LinearLayoutHelper
+import com.wdkl.core.voip.SpeechUtil
+import com.wdkl.ncs.android.component.nursehome.R
+import com.wdkl.ncs.android.component.nursehome.common.Constants
+import com.wdkl.ncs.android.component.nursehome.databinding.AdapterEventListItemBinding
+import com.wdkl.ncs.android.component.nursehome.databinding.WindowIncidentBinding
+import com.wdkl.ncs.android.component.nursehome.settingconfig.SettingConfig
+import com.wdkl.ncs.android.component.nursehome.util.MediaPlayHelper
+import com.wdkl.ncs.android.component.nursehome.util.RingPlayHelper
+import com.wdkl.ncs.android.component.nursehome.util.TimeTransition
+import com.wdkl.ncs.android.lib.adapter.BaseDelegateAdapter
+import com.wdkl.ncs.android.lib.utils.BaseRecyclerViewHolder
+import com.wdkl.ncs.android.middleware.model.vo.InteractionVO
+import com.wdkl.ncs.android.middleware.tcp.channel.DeviceChannel
+import com.wdkl.ncs.android.middleware.tcp.channel.OtherUtil
+import com.wdkl.ncs.android.middleware.tcp.enums.TcpType
+
+class IncidentWindow(var contexts: Context) {
+    var mWindowManager: WindowManager? = null
+    var view: View? = null
+    var eventTcpList = ArrayList<InteractionVO>()
+
+    var adapter: EventListAdapter? = null
+    private lateinit var virtualLayoutManager: VirtualLayoutManager
+    private lateinit var delegateAdapter: DelegateAdapter
+
+    //创建悬浮按钮
+    fun createFloatView(interactionVO: InteractionVO) {
+        eventTcpList.add(interactionVO)
+        //如果当前没有显示则创建view并显示,如果已经显示则仅更新事件列表
+        if (view == null) {
+            val wmParams = WindowManager.LayoutParams()
+            //获取的是WindowManagerImpl.CompatModeWrapper
+            mWindowManager = contexts.getSystemService(Context.WINDOW_SERVICE) as WindowManager
+            if (Build.VERSION.SDK_INT < Build.VERSION_CODES.O) {
+                //设置window type 这个只能在8.0以下系统使用
+                wmParams.type = WindowManager.LayoutParams.TYPE_PHONE
+            } else {
+                //8.0及以上系统使用这个
+                wmParams.type = WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY
+            }
+
+            //设置图片格式,效果为背景透明
+            wmParams.format = PixelFormat.RGBA_8888
+            //设置浮动窗口不可聚焦(实现操作除浮动窗口外的其他可见窗口的操作)
+            //wmParams.flags = WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE
+            //调整悬浮窗显示的停靠位置为左侧置顶
+//        wmParams.gravity = Gravity.RIGHT or Gravity.TOP
+            wmParams.gravity = Gravity.CENTER_HORIZONTAL;
+            // 以屏幕左上角为原点,设置x、y初始值,相对于gravity
+            wmParams.x = 0
+            wmParams.y = 0
+            //设置悬浮窗口长宽数据
+            wmParams.width = WindowManager.LayoutParams.WRAP_CONTENT
+            wmParams.height = WindowManager.LayoutParams.WRAP_CONTENT
+
+            //获取浮动窗口视图所在布局
+            view = LayoutInflater.from(contexts).inflate(R.layout.window_incident, null)
+            adapter = EventListAdapter(contexts, eventTcpList)
+            /**初始化LayoutMannager*/
+            virtualLayoutManager = VirtualLayoutManager(contexts)
+
+            /**初始化适配器*/
+            delegateAdapter = DelegateAdapter(virtualLayoutManager)
+            delegateAdapter.addAdapter(adapter)
+
+            lateinit var windowIncidentBinding: WindowIncidentBinding
+            windowIncidentBinding = DataBindingUtil.bind(view)
+
+            windowIncidentBinding.rvEventList.layoutManager = virtualLayoutManager
+            windowIncidentBinding.rvEventList.adapter = delegateAdapter
+
+            var alphaAnimation = AlphaAnimation(1.0f, 0.1f)
+            alphaAnimation.duration = 600
+            alphaAnimation.interpolator = LinearInterpolator()
+            alphaAnimation.repeatCount = Animation.INFINITE //表示重复多次
+            alphaAnimation.repeatMode = Animation.REVERSE //表示动画结束后,反过来再执行;RESTART表示从头开始,REVERSE表示从末尾倒播
+            windowIncidentBinding.viewEventTitle.startAnimation(alphaAnimation)
+
+            //添加mFloatLayout
+            mWindowManager!!.addView(view, wmParams)
+
+        } else {
+            adapter!!.updateData(eventTcpList)
+        }
+
+        adapter!!.setOnItemClickListener { data, position ->
+            if (SettingConfig.getTtsMode(contexts) == SettingConfig.TTS_OFF) {
+                RingPlayHelper.stopRingTone()
+            } else {
+                SpeechUtil.getInstance().stopSpeak()
+            }
+            if (data.actionType == TcpType.SOS.name) {
+                OtherUtil.cancelSosCall(Constants.ids, data.fromDeviceId, data.id)
+            }
+
+            eventTcpList.remove(data)
+            if (eventTcpList.size > 0) {
+                adapter!!.updateData(eventTcpList)
+            } else {
+                release()
+            }
+        }
+
+    }
+
+
+    /**
+     * 删除窗口
+     */
+    fun release() {
+        DeviceChannel.calling = false
+        if (view != null) {
+            //移除悬浮窗口
+            mWindowManager?.removeView(view)
+        }
+        eventTcpList.clear()
+        mWindowManager = null
+        view = null
+    }
+
+    fun declineItem(item: InteractionVO) {
+        if(view==null){
+            return
+        }else if (eventTcpList.size==0){
+            release()
+        }else{
+           var event =  eventTcpList.stream().filter{it.id.equals(item.id)}.findFirst().orElse(null)
+            if(event!=null){
+                eventTcpList.remove(event)
+                if (eventTcpList.size > 0) {
+                    adapter!!.updateData(eventTcpList)
+                } else {
+                    release()
+                }
+            }
+
+        }
+    }
+
+
+    class EventListAdapter(var context: Context, var data: ArrayList<InteractionVO>) : BaseDelegateAdapter<BaseRecyclerViewHolder<AdapterEventListItemBinding>, InteractionVO>() {
+        /**
+         * 数据提供者
+         */
+        override fun dataProvider(): Any {
+            return data
+        }
+
+        /**
+         * Item坐标
+         */
+        override fun itemFilter(position: Int): Boolean {
+            return true
+        }
+
+        /**
+         * 获取Item总数
+         */
+        override fun getItemCount(): Int {
+            return data.size
+        }
+
+        /**
+         * 创建LayoutHelper
+         */
+        override fun onCreateLayoutHelper(): LayoutHelper {
+            return LinearLayoutHelper(0, data.size)
+        }
+
+        fun updateData(data: ArrayList<InteractionVO>) {
+            this.data = data
+            notifyDataSetChanged()
+        }
+
+        override fun onCreateViewHolder(
+            p0: ViewGroup?,
+            p1: Int
+        ): BaseRecyclerViewHolder<AdapterEventListItemBinding> {
+            return BaseRecyclerViewHolder.build(p0, R.layout.adapter_event_list_item)
+        }
+
+        override fun onBindViewHolder(
+            p0: BaseRecyclerViewHolder<AdapterEventListItemBinding>?,
+            p1: Int
+        ) {
+            p0?.bind { binding ->
+                val interactionVO = getItem(p1)
+                //房间名称
+                var room = interactionVO.fromFrameFullName.substringBefore("-")
+                //如果分机绑定了紧急按钮则加上紧急按钮名称
+                if (interactionVO.fromDeviceType == 21 || interactionVO.fromDeviceType == 13) {
+                    room += interactionVO.fromDeviceName
+                }
+                /*if (interactionVO.createDate != null) {
+                    binding.incidentTime.text =
+                        TimeTransition.stampToDateTime(interactionVO.createDate * 1000)
+                }*/
+
+                if (interactionVO.actionType == TcpType.SOS.name) {
+                    binding.incidentTv.text = room + " 紧急呼叫"
+                    binding.handleImagev.text = "未处理"
+                    binding.handleImagev.setBackgroundResource(R.drawable.sp_event_unhandled_bg)
+                }
+            }
+        }
+    }
+
+}

+ 24 - 25
nursehome/src/main/res/layout/adapter_call_records_item.xml

@@ -3,9 +3,9 @@
 
     <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
         android:layout_width="match_parent"
-        android:layout_height="68dp"
+        android:layout_height="80dp"
         android:background="#ffffff"
-        android:layout_marginTop="6px"
+        android:layout_marginTop="6dp"
         android:paddingTop="4dp"
         android:paddingBottom="4dp">
 
@@ -13,7 +13,7 @@
             android:id="@+id/tab_linyout"
             android:layout_width="wrap_content"
             android:layout_height="wrap_content"
-            android:layout_marginLeft="9px"
+            android:layout_marginLeft="10dp"
             android:layout_centerVertical="true"
             android:orientation="vertical">
 
@@ -27,29 +27,28 @@
                 android:id="@+id/call_status_imagev"
                 android:layout_width="wrap_content"
                 android:layout_height="wrap_content"
-                android:layout_marginTop="2px"
+                android:layout_marginTop="2dp"
                 android:src="@drawable/hu_ru_wei_jie" />
         </LinearLayout>
 
         <RelativeLayout
             android:layout_width="match_parent"
             android:layout_height="match_parent"
-            android:layout_marginTop="4px"
-            android:layout_marginRight="9px"
+            android:layout_marginRight="10dp"
             android:layout_toRightOf="@+id/tab_linyout">
 
             <RelativeLayout
                 android:id="@+id/room_name_linlyout"
                 android:layout_width="match_parent"
                 android:layout_height="wrap_content"
-                android:layout_marginLeft="10px">
+                android:layout_marginLeft="10dp">
 
                 <TextView
                     android:id="@+id/sickbed_tv"
                     android:layout_width="wrap_content"
                     android:layout_height="wrap_content"
                     android:text=""
-                    android:textSize="16px" />
+                    android:textSize="16sp" />
 
                 <TextView
                     android:id="@+id/call_time_tv"
@@ -57,7 +56,7 @@
                     android:layout_height="wrap_content"
                     android:layout_alignParentRight="true"
                     android:text=""
-                    android:textSize="16px"
+                    android:textSize="12sp"
                     android:visibility="gone"/>
 
             </RelativeLayout>
@@ -67,8 +66,8 @@
                 android:layout_width="match_parent"
                 android:layout_height="wrap_content"
                 android:layout_below="@+id/room_name_linlyout"
-                android:layout_marginLeft="10px"
-                android:layout_marginTop="4px"
+                android:layout_marginTop="2dp"
+                android:layout_marginLeft="10dp"
                 android:orientation="vertical">
 
                 <TextView
@@ -76,7 +75,7 @@
                     android:layout_width="wrap_content"
                     android:layout_height="wrap_content"
                     android:text=""
-                    android:textSize="16px" />
+                    android:textSize="14sp" />
 
                 <TextView
                     android:id="@+id/call_list_reply"
@@ -85,18 +84,18 @@
                     android:gravity="center"
                     android:layout_alignParentRight="true"
                     android:drawableLeft="@drawable/hu_jiao"
-                    android:drawablePadding="6px"
-                    android:textSize="14px"
+                    android:drawablePadding="6dp"
+                    android:textSize="14sp"
                     android:text="回拨" />
 
                 <TextView
                     android:id="@+id/call_sos_reply"
-                    android:layout_width="59px"
-                    android:layout_height="20px"
+                    android:layout_width="48dp"
+                    android:layout_height="20dp"
                     android:gravity="center"
                     android:layout_alignParentRight="true"
                     android:background="@drawable/sp_event_unhandled_bg"
-                    android:textSize="16px"
+                    android:textSize="14sp"
                     android:text="未处理"/>
 
                 <LinearLayout
@@ -112,18 +111,18 @@
                         android:layout_width="wrap_content"
                         android:layout_height="wrap_content"
                         android:layout_gravity="center"
-                        android:layout_marginRight="6px"
+                        android:layout_marginRight="6dp"
                         android:src="@drawable/yi_chu_li" />
 
 
                     <TextView
                         android:id="@+id/project_tv"
-                        android:layout_width="59px"
-                        android:layout_height="20px"
+                        android:layout_width="60dp"
+                        android:layout_height="20dp"
                         android:gravity="center"
                         android:text=""
                         android:background="@drawable/sp_event_handled"
-                        android:textSize="12px" />
+                        android:textSize="12sp" />
 
                     <ImageView
                         android:id="@+id/play_tv"
@@ -140,16 +139,16 @@
                 android:layout_height="wrap_content"
                 android:layout_below="@+id/nursing_project_relalyout"
                 android:layout_alignParentRight="true"
-                android:layout_marginTop="4px"
+                android:layout_marginTop="4dp"
                 android:orientation="horizontal">
 
                 <TextView
                     android:id="@+id/conductor_name_tv"
                     android:layout_width="wrap_content"
                     android:layout_height="wrap_content"
-                    android:layout_marginRight="10px"
+                    android:layout_marginRight="10dp"
                     android:text=""
-                    android:textSize="12px"
+                    android:textSize="12sp"
                     android:visibility="gone"/>
 
                 <TextView
@@ -157,7 +156,7 @@
                     android:layout_width="wrap_content"
                     android:layout_height="wrap_content"
                     android:text=""
-                    android:textSize="12px" />
+                    android:textSize="12sp" />
             </LinearLayout>
         </RelativeLayout>
     </RelativeLayout>

+ 61 - 0
nursehome/src/main/res/layout/adapter_event_list_item.xml

@@ -0,0 +1,61 @@
+<?xml version="1.0" encoding="utf-8"?>
+<layout>
+
+    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
+        android:layout_width="match_parent"
+        android:layout_height="100dp"
+        android:paddingLeft="20dp"
+        android:paddingRight="20dp">
+
+        <ImageView
+            android:id="@+id/head_imagev"
+            android:layout_width="60dp"
+            android:layout_height="60dp"
+            android:layout_alignParentLeft="true"
+            android:layout_centerVertical="true"
+            android:src="@drawable/ic_sos_m"
+            android:visibility="gone"/>
+
+        <TextView
+            android:id="@+id/name_tv"
+            android:layout_width="wrap_content"
+            android:layout_height="match_parent"
+            android:layout_marginLeft="20dp"
+            android:layout_toRightOf="@+id/head_imagev"
+            android:gravity="center"
+            android:text="SOS"
+            android:textColor="@color/red_color"
+            android:textSize="36sp" />
+
+        <TextView
+            android:id="@+id/incident_tv"
+            android:layout_width="wrap_content"
+            android:layout_height="match_parent"
+            android:layout_marginLeft="20dp"
+            android:layout_toRightOf="@id/name_tv"
+            android:gravity="center"
+            android:textSize="32sp" />
+
+        <TextView
+            android:id="@+id/handle_imagev"
+            android:layout_width="80dp"
+            android:layout_height="40dp"
+            android:layout_alignParentRight="true"
+            android:layout_centerVertical="true"
+            android:gravity="center"
+            android:padding="4dp"
+            android:text=""
+            android:background="@drawable/sp_event_handled"
+            android:textSize="22sp"/>
+
+        <TextView
+            android:id="@+id/incident_time"
+            android:layout_width="wrap_content"
+            android:layout_height="match_parent"
+            android:layout_marginRight="20dp"
+            android:layout_toLeftOf="@id/handle_imagev"
+            android:gravity="center"
+            android:textSize="20sp"
+            android:visibility="gone"/>
+    </RelativeLayout>
+</layout>

+ 12 - 12
nursehome/src/main/res/layout/fragment_call_records.xml

@@ -9,10 +9,10 @@
         <LinearLayout
             android:id="@+id/button_linlyout"
             android:layout_width="match_parent"
-            android:layout_height="40px"
-            android:layout_marginTop="9px"
-            android:layout_marginLeft="6px"
-            android:layout_marginRight="8px"
+            android:layout_height="40dp"
+            android:layout_marginTop="10dp"
+            android:layout_marginLeft="8dp"
+            android:layout_marginRight="8dp"
             android:orientation="horizontal"
             android:background="#ffffff">
 
@@ -28,12 +28,12 @@
                     android:layout_width="wrap_content"
                     android:layout_height="wrap_content"
                     android:text="未接"
-                    android:textSize="14px" />
+                    android:textSize="16sp" />
                 <ImageView
                     android:id="@+id/no_answer_calls_imagev"
                     android:layout_width="12dp"
                     android:layout_height="4dp"
-                    android:layout_marginTop="2px"
+                    android:layout_marginTop="2dp"
                     android:src="@color/main_color"/>
 
             </LinearLayout>
@@ -51,12 +51,12 @@
                     android:layout_width="wrap_content"
                     android:layout_height="wrap_content"
                     android:text="所有"
-                    android:textSize="14px" />
+                    android:textSize="16sp" />
                 <ImageView
                     android:id="@+id/call_records_imagev"
                     android:layout_width="12dp"
                     android:layout_height="4dp"
-                    android:layout_marginTop="2px"
+                    android:layout_marginTop="2dp"
                     android:visibility="gone"
                     android:src="@color/main_color"/>
 
@@ -76,13 +76,13 @@
                     android:layout_width="wrap_content"
                     android:layout_height="wrap_content"
                     android:text="其它"
-                    android:textSize="14px" />
+                    android:textSize="16sp" />
 
                 <ImageView
                     android:id="@+id/other_imagev"
                     android:layout_width="wrap_content"
                     android:layout_height="wrap_content"
-                    android:layout_marginLeft="15px"
+                    android:layout_marginLeft="14dp"
                     android:src="@drawable/xia_la" />
 
             </LinearLayout>
@@ -92,8 +92,8 @@
             android:layout_width="match_parent"
             android:layout_height="match_parent"
             android:layout_below="@+id/button_linlyout"
-            android:layout_marginLeft="6px"
-            android:layout_marginRight="8px">
+            android:layout_marginLeft="8dp"
+            android:layout_marginRight="8dp">
 
         <com.scwang.smartrefresh.layout.SmartRefreshLayout
             android:id="@+id/refresh"

+ 34 - 0
nursehome/src/main/res/layout/window_incident.xml

@@ -0,0 +1,34 @@
+<?xml version="1.0" encoding="utf-8"?>
+<layout>
+    <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
+        android:layout_width="600dp"
+        android:layout_height="360dp"
+        android:background="@drawable/alert_window_bg">
+
+        <TextView
+            android:id="@+id/view_event_title"
+            android:layout_width="600dp"
+            android:layout_height="wrap_content"
+            android:padding="8dp"
+            android:gravity="center"
+            android:text="紧急呼叫待处理"
+            android:textColor="@color/color_red"
+            android:textSize="48sp"/>
+
+        <LinearLayout
+            android:layout_width="600dp"
+            android:layout_height="280dp"
+            android:layout_marginTop="80dp"
+            android:gravity="center">
+            <android.support.v7.widget.RecyclerView
+                android:id="@+id/rv_event_list"
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:scrollbars="vertical"
+                android:scrollbarSize="10dp"
+                android:fadeScrollbars="false"
+                android:scrollbarStyle="insideOverlay"/>
+        </LinearLayout>
+
+    </FrameLayout>
+</layout>