瀏覽代碼

1。护士主机增加广播模块界面以及接口

xunchuanzhi 1 年之前
父節點
當前提交
4c04bd4d9a
共有 93 個文件被更改,包括 4880 次插入554 次删除
  1. 1 0
      android_bed/src/main/java/com/wdkl/app/ncs/callingbed/activity/CallingbedActivity.kt
  2. 2 0
      android_host/build.gradle
  3. 7 7
      android_host/src/main/java/com/wdkl/ncs/android/component/nursehome/activity/CallingHostActivationActivity.kt
  4. 154 34
      android_host/src/main/java/com/wdkl/ncs/android/component/nursehome/activity/NurseHomeActivity.kt
  5. 2 2
      android_host/src/main/java/com/wdkl/ncs/android/component/nursehome/activity/SystemActivity.kt
  6. 129 0
      android_host/src/main/java/com/wdkl/ncs/android/component/nursehome/adapter/BrGroupAdapter.kt
  7. 187 0
      android_host/src/main/java/com/wdkl/ncs/android/component/nursehome/adapter/BroadcastListAdapter.kt
  8. 4 0
      android_host/src/main/java/com/wdkl/ncs/android/component/nursehome/di/NurseHomeComponent.kt
  9. 45 0
      android_host/src/main/java/com/wdkl/ncs/android/component/nursehome/dialog/BrDeleteDialogHelper.java
  10. 45 0
      android_host/src/main/java/com/wdkl/ncs/android/component/nursehome/dialog/BrPlayDialogHelper.java
  11. 61 0
      android_host/src/main/java/com/wdkl/ncs/android/component/nursehome/dialog/BrstDialogHelper.java
  12. 45 0
      android_host/src/main/java/com/wdkl/ncs/android/component/nursehome/dialog/BrstopDialogHelper.java
  13. 0 1
      android_host/src/main/java/com/wdkl/ncs/android/component/nursehome/fragment/BedinfoFragment.kt
  14. 273 0
      android_host/src/main/java/com/wdkl/ncs/android/component/nursehome/fragment/BroadcastListFragment.kt
  15. 196 0
      android_host/src/main/java/com/wdkl/ncs/android/component/nursehome/fragment/BroadcastNewFragment.kt
  16. 523 0
      android_host/src/main/java/com/wdkl/ncs/android/component/nursehome/fragment/BroadcastSetFragment.kt
  17. 272 0
      android_host/src/main/java/com/wdkl/ncs/android/component/nursehome/fragment/BroadcasthhFragment.kt
  18. 6 6
      android_host/src/main/java/com/wdkl/ncs/android/component/nursehome/fragment/CallRecordsFragment.kt
  19. 2 2
      android_host/src/main/java/com/wdkl/ncs/android/component/nursehome/fragment/DoctorHostFragment.kt
  20. 3 3
      android_host/src/main/java/com/wdkl/ncs/android/component/nursehome/fragment/FramePartFragment.kt
  21. 2 2
      android_host/src/main/java/com/wdkl/ncs/android/component/nursehome/fragment/NurseMoveFragment.kt
  22. 2 2
      android_host/src/main/java/com/wdkl/ncs/android/component/nursehome/fragment/OtherHostFragment.kt
  23. 2 2
      android_host/src/main/java/com/wdkl/ncs/android/component/nursehome/fragment/SystemSettingsFragment.kt
  24. 3 1
      android_host/src/main/java/com/wdkl/ncs/android/component/nursehome/fragment/WorkFragment.kt
  25. 1 0
      android_host/src/main/java/com/wdkl/ncs/android/component/nursehome/util/AppUtil.java
  26. 51 1
      android_host/src/main/java/com/wdkl/ncs/android/component/nursehome/util/MediaPlayHelper.java
  27. 7 2
      android_host/src/main/java/com/wdkl/ncs/android/component/nursehome/window/IncidentWindow.kt
  28. 二進制
      android_host/src/main/res/drawable/ic_broadcast.png
  29. 2 2
      android_host/src/main/res/drawable/radio_button_selector_bg.xml
  30. 7 0
      android_host/src/main/res/drawable/radio_button_selector_bg2.xml
  31. 1 1
      android_host/src/main/res/drawable/radio_button_selector_txt.xml
  32. 7 0
      android_host/src/main/res/drawable/radio_button_selector_txt2.xml
  33. 9 0
      android_host/src/main/res/drawable/shape_br_time_ll_bg.xml
  34. 8 0
      android_host/src/main/res/drawable/shape_bt_call_bg.xml
  35. 8 0
      android_host/src/main/res/drawable/shape_bt_main_hh_bg.xml
  36. 8 0
      android_host/src/main/res/drawable/shape_bt_main_list_bg.xml
  37. 9 0
      android_host/src/main/res/drawable/shape_time_f_bg.xml
  38. 9 0
      android_host/src/main/res/drawable/shape_time_f_bg_d.xml
  39. 二進制
      android_host/src/main/res/drawable/wei.png
  40. 二進制
      android_host/src/main/res/drawable/xuanz.png
  41. 二進制
      android_host/src/main/res/drawable/xuanz2.png
  42. 0 1
      android_host/src/main/res/layout/activity_new_nurse_home.xml
  43. 47 8
      android_host/src/main/res/layout/adapter_broadcasting_frame_part.xml
  44. 25 0
      android_host/src/main/res/layout/br_main_item_lay.xml
  45. 163 0
      android_host/src/main/res/layout/fragment_br_call.xml
  46. 17 17
      android_host/src/main/res/layout/fragment_br_main.xml
  47. 583 0
      android_host/src/main/res/layout/fragment_br_set.xml
  48. 2 1
      android_host/src/main/res/layout/fragment_broadcast.xml
  49. 127 420
      android_host/src/main/res/layout/fragment_broadcast_host.xml
  50. 54 15
      android_host/src/main/res/layout/fragment_system_settings.xml
  51. 63 0
      android_host/src/main/res/layout/main_br_delete_dialog.xml
  52. 64 0
      android_host/src/main/res/layout/main_br_play_dialog.xml
  53. 63 0
      android_host/src/main/res/layout/main_br_st_dialog.xml
  54. 63 0
      android_host/src/main/res/layout/main_br_stop_dialog.xml
  55. 22 0
      android_host/src/main/res/layout/view_title_layout.xml
  56. 二進制
      android_host/src/main/res/mipmap-mdpi/jian_bai.png
  57. 二進制
      android_host/src/main/res/mipmap-mdpi/xia.png
  58. 二進制
      android_host/src/main/res/mipmap-mdpi/xia_h.png
  59. 二進制
      android_host/src/main/res/mipmap-xhdpi/br_shan.png
  60. 二進制
      android_host/src/main/res/mipmap-xhdpi/jian_bai.png
  61. 二進制
      android_host/src/main/res/mipmap-xhdpi/stop_br.png
  62. 二進制
      android_host/src/main/res/mipmap-xxhdpi/jian_bai.png
  63. 二進制
      android_host/src/main/res/mipmap-xxhdpi/stop_br.png
  64. 二進制
      app/release/app-release.apk
  65. 0 1
      app/release/output.json
  66. 2 2
      build.gradle
  67. 12 3
      common/src/main/code/com/wdkl/ncs/android/lib/utils/TimeHandle.kt
  68. 197 0
      common/src/main/code/com/wdkl/ncs/android/lib/widget/VoiceLoadingView.java
  69. 9 0
      common/src/main/res/values/attrs.xml
  70. 1 1
      middleware/src/main/code/com/wdkl/ncs/android/middleware/api/BroadcastApi.kt
  71. 16 1
      middleware/src/main/code/com/wdkl/ncs/android/middleware/common/Constant.java
  72. 52 0
      middleware/src/main/code/com/wdkl/ncs/android/middleware/logic/contract/nursehome/BroadcastListContract.kt
  73. 46 0
      middleware/src/main/code/com/wdkl/ncs/android/middleware/logic/contract/nursehome/BroadcastSetContract.kt
  74. 28 0
      middleware/src/main/code/com/wdkl/ncs/android/middleware/logic/contract/nursehome/BroadcasthhContract.kt
  75. 128 0
      middleware/src/main/code/com/wdkl/ncs/android/middleware/logic/presenter/nursehome/BroadcastListPresenter.kt
  76. 155 0
      middleware/src/main/code/com/wdkl/ncs/android/middleware/logic/presenter/nursehome/BroadcastSetPresenter.kt
  77. 79 0
      middleware/src/main/code/com/wdkl/ncs/android/middleware/logic/presenter/nursehome/BroadcasthhPresenter.kt
  78. 335 0
      middleware/src/main/code/com/wdkl/ncs/android/middleware/model/vo/BroadcastListVO.java
  79. 239 0
      middleware/src/main/code/com/wdkl/ncs/android/middleware/model/vo/BroadcastVO.java
  80. 83 0
      middleware/src/main/code/com/wdkl/ncs/android/middleware/model/vo/GroupBrVo.java
  81. 3 0
      middleware/src/main/code/com/wdkl/ncs/android/middleware/tcp/TcpClientHandler.java
  82. 60 0
      middleware/src/main/code/com/wdkl/ncs/android/middleware/tcp/channel/BroadcastUtil.java
  83. 2 0
      middleware/src/main/code/com/wdkl/ncs/android/middleware/tcp/channel/DeviceChannel.java
  84. 2 0
      middleware/src/main/code/com/wdkl/ncs/android/middleware/tcp/dto/TcpCallback.java
  85. 1 0
      middleware/src/main/code/com/wdkl/ncs/android/middleware/tcp/enums/TcpAction.java
  86. 5 0
      resource/src/main/res/drawable/shape_br_delete_dialog_bt_bg.xml
  87. 5 0
      resource/src/main/res/drawable/shape_br_stop_dialog_bt_bg.xml
  88. 二進制
      resource/src/main/res/raw/event.mp3
  89. 0 1
      welcome/src/main/AndroidManifest.xml
  90. 5 4
      welcome/src/main/code/com/wdkl/ncs/android/component/welcome/activity/WelcomeActivity.kt
  91. 8 6
      welcome/src/main/res/layout-land/activity_welcome.xml
  92. 8 5
      welcome/src/main/res/layout/activity_welcome.xml
  93. 13 0
      welcome/src/main/res/layout/activity_welcome_h.xml

+ 1 - 0
android_bed/src/main/java/com/wdkl/app/ncs/callingbed/activity/CallingbedActivity.kt

@@ -1606,6 +1606,7 @@ class CallingbedActivity :BaseActivity<BedCallingbedActivityPresenter, Callingbe
                                     broadcastChannelId = tcpModel.data.toString()
                                     //如果当前有呼叫或通话则等待
                                     if (Constant.CALL_STATE == Constant.CALL_STANDBY) {
+                                        Log.d("BR", "启动 ")
                                         startBroadcast()
                                     }
                                 }

+ 2 - 0
android_host/build.gradle

@@ -119,6 +119,8 @@ dependencies {
     //广播喊话组件
     compile project(':gstream')
 
+    compile 'com.contrarywind:Android-PickerView:4.1.9'
+
 
 
 }

+ 7 - 7
android_host/src/main/java/com/wdkl/ncs/android/component/nursehome/activity/CallingHostActivationActivity.kt

@@ -97,12 +97,12 @@ class CallingHostActivationActivity  : BaseActivity<DevicePresenter, Callinghost
 
         AppUtil.checkCameraSupport()
 //        暂时关闭喊话广播
-//        try {
-//            GStreamer.init(BaseApplication.appContext)
-//            Constant.gstreamer_init = true
-//        } catch (e: Exception) {
-//            e.printStackTrace()
-//        }
+        try {
+            GStreamer.init(BaseApplication.appContext)
+            Constant.gstreamer_init = true
+        } catch (e: Exception) {
+            e.printStackTrace()
+        }
 
         checkServer()
     }
@@ -323,7 +323,7 @@ class CallingHostActivationActivity  : BaseActivity<DevicePresenter, Callinghost
          Constant.hospital_name = data.hospitalName
          Constant.part_name = data.partName
          Constant.partDisplay = data.partDisplay
-         Constant.part_id = data.partId
+         Constant.PART_ID = data.partId
          Constant.DEVICE_ID = data.id
          Constant.SIP_ID = data.sipId
          Constant.eth_ip = data.ethIp

+ 154 - 34
android_host/src/main/java/com/wdkl/ncs/android/component/nursehome/activity/NurseHomeActivity.kt

@@ -500,9 +500,9 @@ class NurseHomeActivity  : BaseActivity<NurseHomeActivityPresenter,ActivityNewNu
 
     fun checkApp() {
         if (Constant.DEVICE_TYPE == DeviceTypeEnum.DOCTOR_HOST.value()) {
-            presenter.getAppVersion(Constant.part_id, 2) //医生主机
+            presenter.getAppVersion(Constant.PART_ID, 2) //医生主机
         } else {
-            presenter.getAppVersion(Constant.part_id, 1) //rk3128护士主机
+            presenter.getAppVersion(Constant.PART_ID, 1) //rk3128护士主机
         }
     }
 
@@ -637,6 +637,8 @@ class NurseHomeActivity  : BaseActivity<NurseHomeActivityPresenter,ActivityNewNu
         Constant.TCP_SERVER_URL = data.tcpLocalIp
         Constant.TCP_PORT = data.tcpPort
         Constant.reader_idle_time = data.tcpIdleSeconds
+        Constant.RTC_URL = data.mediaLocalIp
+        Constant.RTC_port = data.mediaPort
 
         if (data.sipIp != null) {
             Constant.sip_ip = data.sipIp
@@ -701,7 +703,7 @@ class NurseHomeActivity  : BaseActivity<NurseHomeActivityPresenter,ActivityNewNu
         }
 
         //加载系统设置参数
-        presenter.getSettingData(Constant.part_id)
+        presenter.getSettingData(Constant.PART_ID)
     }
 
     /**
@@ -810,7 +812,7 @@ class NurseHomeActivity  : BaseActivity<NurseHomeActivityPresenter,ActivityNewNu
         //服务器控制点阵屏则护士主机不再加载点阵屏列表
         if (!SettingConfig.getLedControl(activity)) {
             //加载LED点阵屏设备
-            presenter.getLedInfo(Constant.DEVICE_ID, Constant.part_id)
+            presenter.getLedInfo(Constant.DEVICE_ID, Constant.PART_ID)
         }
     }
 
@@ -867,11 +869,15 @@ class NurseHomeActivity  : BaseActivity<NurseHomeActivityPresenter,ActivityNewNu
         return ledList
     }
 
-
-    fun showHome() {
+    fun showHome(removeRight: Boolean) {
         if (select_id != 0) {
             select_id = 0
-            showMiddleFragment(FramePartFragment())
+//            home_radio_bt.isChecked = true
+            if (removeRight) {
+                removeRightFragment()
+            } else {
+                showMiddleFragment(FramePartFragment())
+            }
         }
     }
 
@@ -888,8 +894,8 @@ class NurseHomeActivity  : BaseActivity<NurseHomeActivityPresenter,ActivityNewNu
            //广播
            R.id.menu_broadcasting ->{
                if (select_id != 1) {
+                   showMiddleFragment(BroadcastNewFragment())
                    select_id = 1
-
                }
            }
 //           //探视
@@ -1467,7 +1473,7 @@ class NurseHomeActivity  : BaseActivity<NurseHomeActivityPresenter,ActivityNewNu
                 menu_doctor.setBackgroundResource(R.drawable.shape_main_bt_bg2)
                 menu_doctor.setTextColor(getResources().getColor(R.color.delete_text_color))
             }
-            is BroadcastFragment -> {
+            is BroadcastNewFragment -> {
                 //广播
                 menu_broadcasting.setBackgroundResource(R.drawable.shape_main_bt_bg2)
                 menu_broadcasting.setTextColor(getResources().getColor(R.color.delete_text_color));
@@ -1670,7 +1676,7 @@ class NurseHomeActivity  : BaseActivity<NurseHomeActivityPresenter,ActivityNewNu
                             EventBus.getDefault().post(MessageEvent("handoff", Constant.EVENT_END_CALL))
                         }
 
-                        showSosAlert(tcpModel, false)
+                        showSosAlert(tcpModel, false,true)
 
                         LedHelper.updateLedInfo(interactionVO, true, true)
 
@@ -1836,7 +1842,7 @@ class NurseHomeActivity  : BaseActivity<NurseHomeActivityPresenter,ActivityNewNu
                         }
 
                         val interactionVO = Gson().fromJson(tcpModel.data.toString(), InteractionVO::class.java)
-                        showSosAlert(tcpModel, false)
+                        showSosAlert(tcpModel, false,true)
                         RingPlayHelper.stopRingTone()
                         MediaPlayHelper.getInstance().stopMusic()
 
@@ -1969,8 +1975,8 @@ class NurseHomeActivity  : BaseActivity<NurseHomeActivityPresenter,ActivityNewNu
                     }*/
                 } else if (tcpModel.type == TcpType.DEVICE) {
                     if (tcpModel.action == TcpAction.DeviceAction.SYSTEM_SETTING) {
-                        if (Constant.part_id != -1) {
-                            presenter.getSettingData(Constant.part_id)
+                        if (Constant.PART_ID != -1) {
+                            presenter.getSettingData(Constant.PART_ID)
                         }
                     } else if (tcpModel.action == TcpAction.DeviceAction.DEVICE_REFRESH || tcpModel.action == TcpAction.DeviceAction.RESTART) {
                         if (!DeviceChannel.calling) {
@@ -2006,8 +2012,28 @@ class NurseHomeActivity  : BaseActivity<NurseHomeActivityPresenter,ActivityNewNu
                 } else if (tcpModel.type == TcpType.DATA) {
                     if (tcpModel.action == TcpAction.DataAction.INTERACTION) {
                         EventBus.getDefault().post(MessageEvent(0, Constant.EVENT_REFRESH_CALL_LIST))
+                    }else if (tcpModel.action == TcpAction.DataAction.REMIND) {
+                        //如果当前不在NB-IoT设备界面则提醒
+//                        nb_device_radio_bt.update(0)
+//                        WidgetsUtil.showToastWithImage(getString(R.string.iot_device_warning), 360f, 320f, R.drawable.toast_warn)
+//
+//                        if (!SettingConfig.getNbVoiceWarning(activity)) {
+//                            return
+//                        }
+//
+//                        if (select_id != 11) {
+//                            if (SettingConfig.getTtsMode(activity) != SettingConfig.TTS_ON) {
+//                                SoundPoolManager.getInstance().playSound(5, 1.0f, 1.0f, 0)
+//                            } else {
+//                                if (tcpModel.data != null && tcpModel.data is String) {
+//                                    val text = tcpModel.data as String
+//                                    SpeechUtil.getInstance().stopSpeak(true)
+//                                    SpeechUtil.getInstance().speakSingleText(text)
+//                                }
+//                            }
+//                        }
                     }
-                }else if (tcpModel.type == TcpType.ENTRACEGUARD) {
+                } else if (tcpModel.type == TcpType.ENTRACEGUARD) {
                     if (tcpModel.action == TcpAction.EntraceGuardAction.STRANGER) {
                         if(Constant.CALL_STATE == Constant.CALL_STANDBY) { //空闲状态
                             SpeechUtil.getInstance().stopSpeak(true)
@@ -2048,30 +2074,96 @@ class NurseHomeActivity  : BaseActivity<NurseHomeActivityPresenter,ActivityNewNu
                             Log.d("setTime", "set sys time2: $timeStr, $timeZone")
                         }
                     }
-                } else if (tcpModel.action == TcpAction.ReinforceAction.CALL) {
-                    val interactionVO = Gson().fromJson(tcpModel.data.toString(), InteractionVO::class.java)
-                    LedHelper.updateLedInfo(interactionVO, true, false)
-                    if (Constant.CALL_STATE != Constant.CALL_CALLING
-                        && Constant.CALL_STATE != Constant.CALL_OUTGOING
-                        && Constant.CALL_STATE != Constant.CALL_VISIT_CALLING
-                    ) {
-                        showSosAlert(tcpModel, false)
+                }else if (tcpModel.type == TcpType.REINFORCE) {
+                    if (tcpModel.action == TcpAction.ReinforceAction.CALL) {
+                        val interactionVO = Gson().fromJson(tcpModel.data.toString(), InteractionVO::class.java)
+                        LedHelper.updateLedInfo(interactionVO, true, false)
+                        showSosAlert(tcpModel, false, false)
+                        if (Constant.CALL_STATE != Constant.CALL_CALLING
+                                && Constant.CALL_STATE != Constant.CALL_OUTGOING
+                                && Constant.CALL_STATE != Constant.CALL_VISIT_CALLING
+                        ) {
+                            if (SettingConfig.getTtsMode(this) == SettingConfig.TTS_ON) {
+                                val frameName: String
+                                if (Locale.CHINESE.getLanguage().equals(language)) {
+                                    frameName = Util.appendSpace(interactionVO.fromFrameFullName.replace("-", ","))
+                                } else {
+                                    frameName = interactionVO.fromFrameFullName.substringBefore("-")
+                                }
+                                val text = BaseApplication.appContext.getString(R.string.reinforce_call_speech, frameName)
+                                SpeechUtil.getInstance().addSpeech(text, false)
+                            } else if (SettingConfig.getTtsMode(activity) == SettingConfig.RING_ON) {
+                                RingPlayHelper.playRingTone(activity, R.raw.ring_tone, true)
+                            } else if (SettingConfig.getTtsMode(activity) == SettingConfig.MUSIC_ON) {
+                                RingPlayHelper.playRingTone(activity, R.raw.incoming_call, true)
+                            }
+                        }
+                    }else if (tcpModel.action == TcpAction.ReinforceAction.RESPONSED) {
+                        val interactionVO = Gson().fromJson(tcpModel.data.toString(), InteractionVO::class.java)
+                        SpeechUtil.getInstance().stopSpeak(false)
+                        declineSosItem(interactionVO)
+
+                        EventBus.getDefault().post(MessageEvent(0, Constant.EVENT_REFRESH_CALL_LIST))
+                    }
+                }else if (tcpModel.type == TcpType.EVENT) {
+                    if (tcpModel.action == TcpAction.EventAction.KEY_CLICK) {
+                        val interactionVO = Gson().fromJson(tcpModel.data.toString(), InteractionVO::class.java)
                         if (SettingConfig.getTtsMode(this) == SettingConfig.TTS_ON) {
-                            val frameName: String
                             if (Locale.CHINESE.getLanguage().equals(language)) {
-                                frameName = Util.appendSpace(interactionVO.fromFrameFullName.replace("-", ","))
+                                val frameName: String = Util.appendSpace(interactionVO.fromFrameFullName.replace("-", ","))
+                                val speakStr = "您有新的事件待处理//" + frameName + "//" + interactionVO.data
+                                SpeechUtil.getInstance().addSpeech(speakStr, false)
                             } else {
-                                frameName = interactionVO.fromFrameFullName.substringBefore("-")
+                                RingPlayHelper.playRingTone(BaseApplication.appContext, R.raw.event, false)
                             }
-                            val text = BaseApplication.appContext.getString(R.string.reinforce_call_speech, frameName)
-                            SpeechUtil.getInstance().addSpeech(text, false)
-                        } else if (SettingConfig.getTtsMode(activity) == SettingConfig.RING_ON) {
-                            RingPlayHelper.playRingTone(activity, R.raw.ring_tone, true)
-                        } else if (SettingConfig.getTtsMode(activity) == SettingConfig.MUSIC_ON) {
-                            RingPlayHelper.playRingTone(activity, R.raw.incoming_call, true)
+                        } else {
+                            RingPlayHelper.playRingTone(BaseApplication.appContext, R.raw.event, false)
+                        }
+                        showSosAlert(tcpModel, false, false)
+                    } else if (tcpModel.action == TcpAction.EventAction.CANCEL || tcpModel.action == TcpAction.EventAction.COMPLETED) { // 收到事件取消 或事件完成
+                        val interactionVO = Gson().fromJson(tcpModel.data.toString(), InteractionVO::class.java)
+                        SpeechUtil.getInstance().stopSpeak(false)
+                        declineSosItem(interactionVO)
+                    } else if (tcpModel.action == TcpAction.EventAction.RESPONSED) {
+                        //事件已被其他设备响应
+                        val interactionVO = Gson().fromJson(tcpModel.data.toString(), InteractionVO::class.java)
+                        SpeechUtil.getInstance().stopSpeak(false)
+                        declineSosItem(interactionVO)
+
+                        EventBus.getDefault().post(MessageEvent(0, Constant.EVENT_REFRESH_CALL_LIST))
+                    }
+                } else if (tcpModel.getType() == TcpType.IM) {
+                    if (tcpModel.getAction() == TcpAction.IMAction.MSG) {
+                        val interactionVO = Gson().fromJson(tcpModel.data.toString(), InteractionVO::class.java)
+                        if (SettingConfig.getTtsMode(this) == SettingConfig.TTS_ON) {
+                            if (Locale.CHINESE.getLanguage().equals(language)) {
+                                val frameName: String = Util.appendSpace(interactionVO.fromFrameFullName.replace("-", ","))
+                                val speakStr = "您有新的语音留言//来自//" + frameName
+                                SpeechUtil.getInstance().addSpeech(speakStr, false)
+                            } else {
+                                RingPlayHelper.playRingTone(BaseApplication.appContext, R.raw.event, false)
+                            }
+                        } else {
+                            RingPlayHelper.playRingTone(BaseApplication.appContext, R.raw.event, false)
+                        }
+
+                        showSosAlert(tcpModel, false, false)
+                    }
+                } else if (tcpModel.type == TcpType.BROADCAST) {
+                    if (tcpModel.action == TcpAction.BroadcastAction.START) {
+                        if (tcpModel.data != null) {
+                            //发送音频广播后返回的数据
+                            val interactionVO = Gson().fromJson(tcpModel.data.toString(), InteractionVO::class.java)
+                            Constant.bcInteractionId = interactionVO.id
                         }
+                    } else if (tcpModel.action == TcpAction.BroadcastAction.STOP) {
+                        //广播结束
+                        Constant.bcStart = false
+                        tv_broadcast_state.visibility = View.GONE
                     }
                 }
+
+
             }
 
             Constant.EVENT_ACCEPT_CALL -> {
@@ -2150,6 +2242,34 @@ class NurseHomeActivity  : BaseActivity<NurseHomeActivityPresenter,ActivityNewNu
             Constant.EVENT_RESTART_APP -> {
                 AppUpdateHelper.restartApp(activity)
             }
+
+            Constant.EVENT_r_br_set -> {
+               showMiddleFragment(BroadcastNewFragment())
+
+            }
+
+            Constant.EVENT_BROADCAST_STATE -> {
+                val state = messageEvent.getMessage() as String
+                if ("on".equals(state)) {
+                    tv_broadcast_state.visibility = View.VISIBLE
+                } else {
+                    tv_broadcast_state.visibility = View.GONE
+                }
+            }
+
+            Constant.EVENT_V_br_set -> {
+                    supportFragmentManager.inTransaction {
+
+                        val bundle = Bundle()
+                        bundle.putString("id", messageEvent.message.toString())
+                        val fragment = BroadcastSetFragment()
+                        remove(currentFragment!!)
+                        currentFragment = fragment
+                        fragment.arguments = bundle
+                        add(R.id.host_main_frame, fragment)
+                    }
+
+            }
         }
 
     }
@@ -2165,14 +2285,14 @@ class NurseHomeActivity  : BaseActivity<NurseHomeActivityPresenter,ActivityNewNu
         return result
     }
 
-    private fun showSosAlert(item: TcpModel, newWindow: Boolean) {
+    private fun showSosAlert(item: TcpModel, newWindow: Boolean, emergency: Boolean) {
         if (incidentWindow!!.view == null) {
-            incidentWindow?.createFloatView(item)
+            incidentWindow?.createFloatView(item, emergency)
         } else {
             if (newWindow) {
                 incidentWindow?.release()
             }
-            incidentWindow?.createFloatView(item)
+            incidentWindow?.createFloatView(item, emergency)
         }
     }
 

+ 2 - 2
android_host/src/main/java/com/wdkl/ncs/android/component/nursehome/activity/SystemActivity.kt

@@ -83,8 +83,8 @@ class SystemActivity : BaseActivity<SystemActivityPresenter, CallingbedSettingMa
         settings_main_4_ll.setOnClickListener {
             UpdataDialogHelper.showDialog(activity, object : UpdataDialogHelper.ClickListener {
                 override fun onClick() {
-                    if (Constant.part_id != null) {
-                        presenter.getAppVersion(Constant.part_id, 1)
+                    if (Constant.PART_ID != null) {
+                        presenter.getAppVersion(Constant.PART_ID, 1)
                     } else {
                         showMessage("null part id")
                     }

+ 129 - 0
android_host/src/main/java/com/wdkl/ncs/android/component/nursehome/adapter/BrGroupAdapter.kt

@@ -0,0 +1,129 @@
+package com.wdkl.ncs.android.component.nursehome.adapter
+
+import android.content.Context
+import android.graphics.Color
+import android.view.LayoutInflater
+import android.view.View
+import android.view.ViewGroup
+import android.widget.TextView
+import androidx.recyclerview.widget.RecyclerView
+import com.wdkl.ncs.android.component.nursehome.R
+
+import com.wdkl.ncs.android.middleware.model.vo.ClerkByVO
+import com.wdkl.ncs.android.middleware.model.vo.GroupBrVo
+import com.wdkl.ncs.android.middleware.model.vo.SingDataBean
+
+class BrGroupAdapter : RecyclerView.Adapter<BrGroupAdapter.ViewHolder>{
+
+    private var context: Context
+    private var data: ArrayList<GroupBrVo>
+    private lateinit var onItemClickListener: OnItemClickListener
+    private var selectedPosition = -1
+
+    private val selectedPositions = mutableSetOf<Int>()
+
+
+
+
+
+
+
+    constructor(context: Context, data: ArrayList<GroupBrVo>): super() {
+        this.context = context
+        this.data = data
+    }
+
+    fun setOnItemClickListener(listener: OnItemClickListener) {
+        this.onItemClickListener = listener
+    }
+
+    fun updateData(data: ArrayList<GroupBrVo>) {
+        this.data = data
+        notifyDataSetChanged()
+    }
+
+    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
+        val view = LayoutInflater.from(parent.context).inflate(R.layout.br_main_item_lay, parent, false)
+        val viewHolder = ViewHolder(view)
+
+        return viewHolder
+    }
+
+    override fun getItemCount(): Int {
+        return data.size
+    }
+
+    override fun onBindViewHolder(holder: ViewHolder, position: Int) {
+        val currentItem = data[position]
+        if ( data.get(position).group_name!=null){
+            holder.signitemname.text = data.get(position).group_name
+        }
+        // 设置item的背景颜色
+//        if (position == selectedPosition) {
+//            holder.signitemname.setBackgroundResource(R.drawable.shape_time_f_bg_d);// 设置选中状态的背景颜色
+//            holder.signitemname.setTextColor(Color.parseColor("#0090ff"));// 设置选中状态的字体颜色
+//        } else {
+//            holder.signitemname.setBackgroundResource(R.drawable.shape_time_f_bg);// 设置选中状态的背景颜色
+//            holder.signitemname.setTextColor(Color.parseColor("#737373"));// 设置默认状态的字体颜色
+//
+//        }
+
+        if (selectedPositions.contains(position)) {
+            holder.signitemname.setBackgroundResource(R.drawable.shape_time_f_bg_d)
+            holder.signitemname.setTextColor(Color.parseColor("#0090ff"))
+        } else {
+            holder.signitemname.setBackgroundResource(R.drawable.shape_time_f_bg)
+            holder.signitemname.setTextColor(Color.parseColor("#737373"))
+        }
+
+        holder.signitemname.setOnClickListener {
+            // 更新选中状态
+            if (selectedPositions.contains(position)) {
+                selectedPositions.remove(position)
+            } else {
+                selectedPositions.add(position)
+            }
+            val ids = selectedPositions.map { data[it].id }.joinToString(",")
+            onItemClickListener.onItemClick(holder.signitemname, position,ids)
+            notifyItemChanged(position)
+        }
+    }
+
+     fun updateSelectedPosition(newPosition: Int) {
+        selectedPosition = newPosition
+        notifyDataSetChanged()
+    }
+
+    fun matchAndChangeBackground(ids: String) {
+        if (ids.isEmpty()) return
+        val idList = ids.split(",").map { it.trim().toIntOrNull() }.filterNotNull()
+
+        for (i in data.indices) {
+            val item = data[i]
+            if (idList.contains(item.id)) {
+                if (!selectedPositions.contains(i)) {
+                    selectedPositions.add(i)
+                    notifyItemChanged(i)
+                }
+            } else {
+                if (selectedPositions.contains(i)) {
+                    selectedPositions.remove(i)
+                    notifyItemChanged(i)
+                }
+            }
+        }
+    }
+    class ViewHolder: RecyclerView.ViewHolder {
+        var signitemname : TextView
+
+
+        constructor(itemView: View): super(itemView) {
+            signitemname = itemView.findViewById(R.id.br_main_item_name)
+
+        }
+    }
+
+    interface OnItemClickListener {
+        fun onItemClick(view: View, keyId: Int,ids:String)
+    }
+}

+ 187 - 0
android_host/src/main/java/com/wdkl/ncs/android/component/nursehome/adapter/BroadcastListAdapter.kt

@@ -0,0 +1,187 @@
+package com.wdkl.ncs.android.component.nursehome.adapter
+
+import android.util.Log
+import android.view.View
+import android.view.ViewGroup
+import com.alibaba.android.vlayout.LayoutHelper
+import com.alibaba.android.vlayout.layout.LinearLayoutHelper
+import com.wdkl.ncs.android.component.nursehome.R
+import com.wdkl.ncs.android.component.nursehome.databinding.AdapterBroadcastBinding
+import com.wdkl.ncs.android.component.nursehome.databinding.AdapterBroadcastingFramePartBinding
+import com.wdkl.ncs.android.component.nursehome.fragment.BroadcastFragment
+import com.wdkl.ncs.android.lib.adapter.BaseDelegateAdapter
+import com.wdkl.ncs.android.lib.utils.BaseRecyclerViewHolder
+import com.wdkl.ncs.android.middleware.model.dos.BroadcastDO
+import com.wdkl.ncs.android.middleware.model.vo.BroadcastVO
+
+/**
+ * 广播列表适配器
+ */
+class BroadcastListAdapter( val data: ArrayList<BroadcastVO>) : BaseDelegateAdapter<BaseRecyclerViewHolder<AdapterBroadcastingFramePartBinding>, BroadcastVO>() {
+
+    private lateinit var onItemClickListener: OnItemClickListener
+
+    fun setOnItemClickListener(listener: OnItemClickListener) {
+        this.onItemClickListener = listener
+    }
+    /**
+     * 数据提供者
+     */
+    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)
+    }
+
+    /**
+     * 创建ViewHolder
+     */
+    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): BaseRecyclerViewHolder<AdapterBroadcastingFramePartBinding> {
+        return BaseRecyclerViewHolder.build(parent, R.layout.adapter_broadcasting_frame_part)
+    }
+
+    /**
+     * 绑定数据
+     */
+    override fun onBindViewHolder(holder: BaseRecyclerViewHolder<AdapterBroadcastingFramePartBinding>, position: Int) {
+        holder?.bind { binding ->
+            try {
+                val itemData = getItem(position)
+                binding.brName.text = itemData.title
+                var  Status=""
+                if (itemData.isStatus){
+                    Status="启用"
+                }else{
+                    Status="未启用"
+                }
+                if (itemData.broadcast_mode!=null){
+                    if (itemData.broadcast_mode == 1){
+                        //手动模式
+                        binding.brType.text = "手动模式 "+Status
+                    }else{
+                        //自动模式
+                        if (itemData.play_mode!=null){
+                            if (itemData.play_mode == 1){
+                                binding.brType.text = "循环播放 "+Status
+                            }else{
+                                binding.brType.text = "自动播放"+itemData.repeat_times+"次 "+Status
+                            }
+                        }
+                    }
+                }
+
+
+                if(itemData.group_names!=null){
+                    binding.brRegion.text = "广播区域:"+itemData.group_names
+                }else if (itemData.frame_names!=null){
+                    binding.brRegion.text = "广播区域:"+itemData.frame_names
+                }else{
+                    binding.brRegion.text = "广播区域:暂无设置"
+                }
+
+                if (!itemData.play_end.equals("") && !itemData.play_start.equals("")){
+                    binding.brTime.text = "广播时间:"+getWeekDays(itemData.repeat_day ?: "")+" "+itemData.play_start+"~"+itemData.play_end
+                }else{
+                    binding.brTime.text = "广播时间:"+getWeekDays(itemData.repeat_day ?: "")+" "+itemData.play_start+itemData.play_end
+                }
+
+
+
+                //删除
+                binding.brDelete.setOnClickListener {
+                    onItemClickListener.onItemClick(itemData.id,itemData.group_ids?:"","删除")
+                }
+                //试听
+                binding.brTing.setOnClickListener {
+                    onItemClickListener.onItemClick(itemData.id,itemData.group_ids?:"","试听")
+                }
+                //播放
+                binding.brPlay.setOnClickListener {
+                    onItemClickListener.onItemClick(itemData.id,itemData.group_ids?:"","播放")
+                }
+                //停止
+                binding.brStop.setOnClickListener {
+                    onItemClickListener.onItemClick(itemData.id,itemData.group_ids?:"","停止")
+                }
+                //设置
+                binding.brSettings.setOnClickListener {
+                    onItemClickListener.onItemClick(itemData.id,itemData.group_ids?:"","设置")
+                }
+            } catch (e: Exception) {
+                Log.e(" BroadcastListAdapter",e.toString())
+            }
+
+
+        }
+    }
+    fun getWeekDays(weekString: String): String {
+        if (weekString.equals(""))return ""
+        val weekMap: Map<Char, String> = mapOf(
+                '1' to "周一",
+                '2' to "周二",
+                '3' to "周三",
+                '4' to "周四",
+                '5' to "周五",
+                '6' to "周六",
+                '0' to "周日"
+        )
+
+        val selectedDays = weekString.split(",")
+                .mapNotNull {  weekMap[it.firstOrNull() ?: ' '] }
+                .distinct()
+                .sortedBy { weekMap.keys.indexOf(weekMap.entries.firstOrNull { e -> e.value == it }?.key) }
+
+        return if (selectedDays.size == 7) {
+            "每天"
+        } else if (selectedDays.size == 1) {
+            selectedDays.joinToString()
+        } else {
+
+            val firstDayIndex = weekMap.keys.indexOf(weekMap.entries.firstOrNull { e -> e.value == selectedDays.first() }?.key)
+            val lastDayIndex = weekMap.keys.indexOf(weekMap.entries.firstOrNull { e -> e.value == selectedDays.last() }?.key)
+
+            if (lastDayIndex - firstDayIndex + 1 == selectedDays.size) {
+                "从${selectedDays.first()}到${selectedDays.last()}"
+            } else {
+                selectedDays.joinToString(separator = "、")
+            }
+//            var result = "从${selectedDays.first()}"
+//            var lastDay = selectedDays.first()
+//            var rangeStart = lastDay
+//            for (i in 1 until selectedDays.size) {
+//                val thisDay = selectedDays[i]
+//                if (weekMap.keys.indexOf(weekMap.entries.firstOrNull { e -> e.value == thisDay }?.key) != weekMap.keys.indexOf(weekMap.entries.firstOrNull { e -> e.value == lastDay }?.key) + 1) {
+//                    result += "、${rangeStart}到${lastDay}"
+//                    rangeStart = thisDay
+//                }
+//                lastDay = thisDay
+//            }
+//            result += "、${rangeStart}到${lastDay}"
+//            result
+        }
+    }
+    interface OnItemClickListener {
+        fun onItemClick(ID:Int, ids: String,type: String)
+    }
+}
+
+

+ 4 - 0
android_host/src/main/java/com/wdkl/ncs/android/component/nursehome/di/NurseHomeComponent.kt

@@ -39,5 +39,9 @@ interface NurseHomeComponent{
     fun inject(activity: WebviewActivity)
     fun inject(activity: SystemActivity)
     fun inject(activity: BedAdviceFragment)
+    fun inject(activity: BroadcastNewFragment)
+    fun inject(activity: BroadcastListFragment)
+    fun inject(activity: BroadcasthhFragment)
+    fun inject(activity: BroadcastSetFragment)
 
 }

+ 45 - 0
android_host/src/main/java/com/wdkl/ncs/android/component/nursehome/dialog/BrDeleteDialogHelper.java

@@ -0,0 +1,45 @@
+package com.wdkl.ncs.android.component.nursehome.dialog;
+
+import android.app.Activity;
+import android.app.AlertDialog;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.widget.Button;
+
+import com.wdkl.ncs.android.component.nursehome.R;
+
+
+public class BrDeleteDialogHelper {
+
+    private static AlertDialog alertDialog;
+
+    public static void showDialog(Activity activity, ClickListener clickListener) {
+
+        View contentView = LayoutInflater.from(activity).inflate(R.layout.main_br_delete_dialog, null);
+        AlertDialog.Builder builder = new AlertDialog.Builder(activity);
+        builder.setView(contentView);
+
+        Button btn_cancel = contentView.findViewById(R.id.br_delete_cancel_button);
+        Button determine_button = contentView.findViewById(R.id.br_delete_determine_button);
+        btn_cancel.setOnClickListener(v -> {
+            if (alertDialog != null && alertDialog.isShowing()) {
+                alertDialog.dismiss();
+            }
+        });
+        determine_button.setOnClickListener(v -> {
+            if (alertDialog != null && alertDialog.isShowing()) {
+                alertDialog.dismiss();
+                if (clickListener != null)
+                    clickListener.onClick();
+                }
+        });
+        alertDialog = builder.create();
+        alertDialog.setCanceledOnTouchOutside(true);
+        alertDialog.setCancelable(true);
+        alertDialog.show();
+
+    }
+    public interface ClickListener{
+        void onClick();
+    }
+}

+ 45 - 0
android_host/src/main/java/com/wdkl/ncs/android/component/nursehome/dialog/BrPlayDialogHelper.java

@@ -0,0 +1,45 @@
+package com.wdkl.ncs.android.component.nursehome.dialog;
+
+import android.app.Activity;
+import android.app.AlertDialog;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.widget.Button;
+
+import com.wdkl.ncs.android.component.nursehome.R;
+
+
+public class BrPlayDialogHelper {
+
+    private static AlertDialog alertDialog;
+
+    public static void showDialog(Activity activity, ClickListener clickListener) {
+
+        View contentView = LayoutInflater.from(activity).inflate(R.layout.main_br_play_dialog, null);
+        AlertDialog.Builder builder = new AlertDialog.Builder(activity);
+        builder.setView(contentView);
+
+        Button btn_cancel = contentView.findViewById(R.id.br_play_cancel_button);
+        Button determine_button = contentView.findViewById(R.id.br_play_determine_button);
+        btn_cancel.setOnClickListener(v -> {
+            if (alertDialog != null && alertDialog.isShowing()) {
+                alertDialog.dismiss();
+            }
+        });
+        determine_button.setOnClickListener(v -> {
+            if (alertDialog != null && alertDialog.isShowing()) {
+                alertDialog.dismiss();
+                if (clickListener != null)
+                    clickListener.onClick();
+                }
+        });
+        alertDialog = builder.create();
+        alertDialog.setCanceledOnTouchOutside(true);
+        alertDialog.setCancelable(true);
+        alertDialog.show();
+
+    }
+    public interface ClickListener{
+        void onClick();
+    }
+}

+ 61 - 0
android_host/src/main/java/com/wdkl/ncs/android/component/nursehome/dialog/BrstDialogHelper.java

@@ -0,0 +1,61 @@
+package com.wdkl.ncs.android.component.nursehome.dialog;
+
+import android.app.Activity;
+import android.app.AlertDialog;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.widget.Button;
+import android.widget.TextView;
+
+import com.wdkl.ncs.android.component.nursehome.R;
+import com.wdkl.ncs.android.component.nursehome.util.MediaPlayHelper;
+
+
+public class BrstDialogHelper {
+
+    private static AlertDialog alertDialog;
+
+    public static void showDialog(Activity activity, ClickListener clickListener) {
+
+        View contentView = LayoutInflater.from(activity).inflate(R.layout.main_br_st_dialog, null);
+        AlertDialog.Builder builder = new AlertDialog.Builder(activity);
+        builder.setView(contentView);
+
+        Button btn_cancel = contentView.findViewById(R.id.br_st_cancel_button);
+        Button determine_button = contentView.findViewById(R.id.br_st_determine_button);
+        TextView br_st_tip_text = contentView.findViewById(R.id.br_st_tip_text);
+        Boolean isPlay =MediaPlayHelper.getInstance().isMediaPlaying();
+        if (isPlay){
+            br_st_tip_text.setText("确认停止播放");
+        }
+
+
+        btn_cancel.setOnClickListener(v -> {
+            if (alertDialog != null && alertDialog.isShowing()) {
+                alertDialog.dismiss();
+            }
+        });
+        determine_button.setOnClickListener(v -> {
+            if (alertDialog != null && alertDialog.isShowing()) {
+                if (isPlay){
+                    MediaPlayHelper.getInstance().stopMusic();
+                    alertDialog.dismiss();
+                }else {
+                    if (clickListener != null)
+                        clickListener.onClick();
+                    alertDialog.dismiss();
+                }
+
+                }
+
+        });
+        alertDialog = builder.create();
+        alertDialog.setCanceledOnTouchOutside(true);
+        alertDialog.setCancelable(true);
+        alertDialog.show();
+
+    }
+    public interface ClickListener{
+        void onClick();
+    }
+}

+ 45 - 0
android_host/src/main/java/com/wdkl/ncs/android/component/nursehome/dialog/BrstopDialogHelper.java

@@ -0,0 +1,45 @@
+package com.wdkl.ncs.android.component.nursehome.dialog;
+
+import android.app.Activity;
+import android.app.AlertDialog;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.widget.Button;
+
+import com.wdkl.ncs.android.component.nursehome.R;
+
+
+public class BrstopDialogHelper {
+
+    private static AlertDialog alertDialog;
+
+    public static void showDialog(Activity activity, ClickListener clickListener) {
+
+        View contentView = LayoutInflater.from(activity).inflate(R.layout.main_br_stop_dialog, null);
+        AlertDialog.Builder builder = new AlertDialog.Builder(activity);
+        builder.setView(contentView);
+
+        Button btn_cancel = contentView.findViewById(R.id.br_stop_cancel_button);
+        Button determine_button = contentView.findViewById(R.id.br_stop_determine_button);
+        btn_cancel.setOnClickListener(v -> {
+            if (alertDialog != null && alertDialog.isShowing()) {
+                alertDialog.dismiss();
+            }
+        });
+        determine_button.setOnClickListener(v -> {
+            if (alertDialog != null && alertDialog.isShowing()) {
+                alertDialog.dismiss();
+                if (clickListener != null)
+                    clickListener.onClick();
+                }
+        });
+        alertDialog = builder.create();
+        alertDialog.setCanceledOnTouchOutside(true);
+        alertDialog.setCancelable(true);
+        alertDialog.show();
+
+    }
+    public interface ClickListener{
+        void onClick();
+    }
+}

+ 0 - 1
android_host/src/main/java/com/wdkl/ncs/android/component/nursehome/fragment/BedinfoFragment.kt

@@ -54,7 +54,6 @@ class  BedinfoFragment : BaseFragment<BedAdviceFragmentPresenter, FragmentInfoLa
         info_f_ar.adapter = adapter
 
         if (receivedFrame != null) {
-
             f_info_phone.text =   "住院号码:"+receivedFrame?.cardNo?.toString()?: ""
             f_info_time.text = StringUtil.getResString(R.string.indate) + TimeHandle.getDateTime(receivedFrame.customerInDate * 1000, "yyyy.MM.dd")
             bed_medic_name.text = receivedFrame?.doctorName?: ""

+ 273 - 0
android_host/src/main/java/com/wdkl/ncs/android/component/nursehome/fragment/BroadcastListFragment.kt

@@ -0,0 +1,273 @@
+package com.wdkl.ncs.android.component.nursehome.fragment
+
+import androidx.fragment.app.Fragment
+import com.alibaba.android.vlayout.DelegateAdapter
+import com.alibaba.android.vlayout.VirtualLayoutManager
+import com.enation.javashop.net.engine.model.NetState
+import com.wdkl.ncs.android.component.nursehome.R
+import com.wdkl.ncs.android.component.nursehome.adapter.BroadcastListAdapter
+import com.wdkl.ncs.android.component.nursehome.databinding.FragmentBrMainBinding
+import com.wdkl.ncs.android.component.nursehome.dialog.BrDeleteDialogHelper
+import com.wdkl.ncs.android.component.nursehome.dialog.BrPlayDialogHelper
+import com.wdkl.ncs.android.component.nursehome.dialog.BrstDialogHelper
+import com.wdkl.ncs.android.component.nursehome.dialog.BrstopDialogHelper
+import com.wdkl.ncs.android.component.nursehome.launch.NurseHomeLaunch
+import com.wdkl.ncs.android.component.nursehome.util.MediaPlayHelper
+import com.wdkl.ncs.android.lib.base.BaseApplication
+import com.wdkl.ncs.android.lib.base.BaseFragment
+import com.wdkl.ncs.android.lib.utils.showMessage
+import com.wdkl.ncs.android.middleware.common.Constant
+import com.wdkl.ncs.android.middleware.common.MessageEvent
+import com.wdkl.ncs.android.middleware.logic.contract.nursehome.BroadcastListContract
+import com.wdkl.ncs.android.middleware.logic.presenter.nursehome.BroadcastListPresenter
+import com.wdkl.ncs.android.middleware.model.vo.BroadcastListVO
+import com.wdkl.ncs.android.middleware.model.vo.BroadcastListVO.BroadcastFilesBean
+import com.wdkl.ncs.android.middleware.model.vo.BroadcastVO
+import com.wdkl.ncs.android.middleware.tcp.TcpClient
+import com.wdkl.ncs.android.middleware.tcp.channel.BroadcastUtil
+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 com.wdkl.ncs.android.middleware.utils.CommonUtils
+import kotlinx.android.synthetic.main.fragment_br_main.*
+import org.greenrobot.eventbus.EventBus
+import org.greenrobot.eventbus.Subscribe
+import org.greenrobot.eventbus.ThreadMode
+
+/**
+ * 广播列表界面
+ */
+class BroadcastListFragment : BaseFragment<BroadcastListPresenter, FragmentBrMainBinding>(), BroadcastListContract.View ,BroadcastListAdapter.OnItemClickListener{
+
+
+    var TAG = BroadcastListFragment::class.java.getSimpleName()
+
+    private lateinit var virtualLayoutManager: VirtualLayoutManager
+    private lateinit var delegateAdapter: DelegateAdapter
+
+    //录音适配器
+    var broadcastAdapter: BroadcastListAdapter? = null
+
+    private var infoFragment: Fragment? = null
+
+    /**
+     * 提供layoutID
+     */
+    override fun getLayId(): Int {
+        return R.layout.fragment_br_main
+    }
+
+    /**
+     *初始化依赖注入
+     */
+    override fun bindDagger() {
+        NurseHomeLaunch.component.inject(this)
+    }
+
+    /**
+     *初始化操作
+     */
+    override fun init() {
+        /**初始化LayoutMannager*/
+        virtualLayoutManager = VirtualLayoutManager(this.activity)
+        /**初始化适配器*/
+        delegateAdapter = DelegateAdapter(virtualLayoutManager)
+
+        broadcastAdapter = BroadcastListAdapter(ArrayList())
+        broadcastAdapter!!.setOnItemClickListener(this)
+        delegateAdapter.addAdapter(broadcastAdapter)
+
+        /**配置到RecycleView*/
+        br_listView.layoutManager = virtualLayoutManager
+        br_listView.adapter = delegateAdapter
+
+
+        if (Constant.PART_ID!=null && Constant.PART_ID!=1 ){
+            presenter.loadData(Constant.PART_ID)
+        }
+//        presenter.loadDatas(2,10)
+    }
+
+    /**
+     *绑定事件
+     */
+    override fun bindEvent() {
+
+    }
+
+    private fun  setui(){
+    }
+
+    /**
+     *页面销毁回调
+     */
+    override fun destory() {
+    }
+
+    /**
+     *显示数据
+     */
+    override fun showData(data: ArrayList<BroadcastVO>) {
+        broadcastAdapter!!.data.clear()
+        broadcastAdapter!!.data.addAll(data)
+        //Log.i(TAG,"其它主机数量 " + devices.size)
+        broadcastAdapter!!.notifyDataSetChanged()
+    }
+
+    override fun onItemClick(ID: Int, ids: String, type: String) {
+        when (type){
+            "删除" -> {
+                BrDeleteDialogHelper.showDialog(activity) {
+
+                }
+            }
+            "试听" -> {
+                BrstDialogHelper.showDialog(activity) {
+                    presenter.getBroadcastFileList(ID)
+
+                }
+            }
+            "播放" -> {
+                BrPlayDialogHelper.showDialog(activity) {
+                    val numbers = convertToIntArray(ids)
+                    val tcpModel = BroadcastUtil.startAudioBroadcast(Constant.DEVICE_ID, numbers.contentToString(), ID)
+                    TcpClient.getInstance().sendMsg(tcpModel.toJson())
+                    EventBus.getDefault().post(MessageEvent("on", Constant.EVENT_BROADCAST_STATE))
+                }
+            }
+            "停止" -> {
+                BrstopDialogHelper.showDialog(activity) {
+                    val tcpModel = BroadcastUtil.stopBroadcast(Constant.DEVICE_ID, Constant.bcInteractionId)
+                    TcpClient.getInstance().sendMsg(tcpModel.toJson())
+                    EventBus.getDefault().post(MessageEvent("off", Constant.EVENT_BROADCAST_STATE))
+                }
+            }
+            "设置" -> {
+                EventBus.getDefault().post(MessageEvent(ID.toString(), Constant.EVENT_V_br_set))
+            }
+
+        }
+
+    }
+
+    /**
+     *停止广播
+     */
+    override fun StopAudioData(data: ArrayList<BroadcastVO>) {
+
+    }
+    /**
+     *删除广播
+     */
+    override fun DELETEData(data: ArrayList<BroadcastVO>) {
+
+    }
+
+    override fun showDatas(data: ArrayList<BroadcastVO>) {
+        broadcastAdapter!!.data.clear()
+        broadcastAdapter!!.data.addAll(data)
+        //Log.i(TAG,"其它主机数量 " + devices.size)
+        broadcastAdapter!!.notifyDataSetChanged()
+    }
+    var broadcast_files: List<BroadcastFilesBean>? = null
+
+    override fun showMusic(data: BroadcastListVO) {
+        if (data!=null){
+            if (data.broadcast_files!=null){
+                val urls = mutableListOf<String>()
+                val url: String = CommonUtils.getUrl(BaseApplication.appContext)
+                val port: String = CommonUtils.getUrlPort(BaseApplication.appContext)
+
+                for (broadcast in data.broadcast_files) {
+                    val url = "http://$url:$port/"+broadcast.file_url
+                    urls.add(url)
+                }
+                MediaPlayHelper.getInstance().playSequentialUrls(urls, 1.0f, false)
+                MediaPlayHelper.getInstance().setOnPlayCompletionListener {
+                    showMessage("播放完成")
+                    // 在这里处理音频播放完成的逻辑
+                    MediaPlayHelper.getInstance().stopMusic()
+                }
+            }else{
+                showMessage("没有文件广播")
+            }
+
+        }
+
+
+    }
+
+    /**
+     *处理错误信息
+     */
+    override fun onError(message: String, type: Int) {
+    }
+
+    /**
+     *耗时加载完成
+     */
+    override fun complete(message: String, type: Int) {
+    }
+
+    /**
+     *耗时加载开始
+     */
+    override fun start() {
+    }
+
+    /**
+     *处理网络状态
+     */
+    override fun networkMonitor(state: NetState) {
+    }
+
+    fun convertToIntArray(input: String): IntArray {
+        if (input.equals("")){
+            return IntArray(0)
+        }
+        val parts = input.split(",")
+        val numbers = IntArray(parts.size)
+
+        for (i in parts.indices) {
+            numbers[i] = parts[i].toInt()
+        }
+
+        return numbers
+    }
+
+
+    override fun onStart() {
+        super.onStart()
+        if (!EventBus.getDefault().isRegistered(this)) {
+            // 未注册的逻辑处理
+            EventBus.getDefault().register(this)
+        }
+
+    }
+
+    override fun onStop() {
+        super.onStop()
+        if (EventBus.getDefault().isRegistered(this)) {
+            // 已注册的逻辑处理
+            EventBus.getDefault().unregister(this)
+        }
+
+    }
+    @Subscribe(threadMode = ThreadMode.MAIN)
+    fun onMoonEvent(messageEvent: MessageEvent) {
+        when (messageEvent.getType()) {
+            Constant.EVENT_TCP_MSG -> {
+                val tcpModel = messageEvent.getMessage() as TcpModel
+                if (tcpModel.type == TcpType.BROADCAST) {
+                    if (tcpModel.action == TcpAction.BroadcastAction.STOP) {
+                        //广播结束
+                        Constant.bcStart = false
+
+                    }
+                }
+            }
+        }
+    }
+
+
+}

+ 196 - 0
android_host/src/main/java/com/wdkl/ncs/android/component/nursehome/fragment/BroadcastNewFragment.kt

@@ -0,0 +1,196 @@
+package com.wdkl.ncs.android.component.nursehome.fragment
+
+import android.app.FragmentManager
+import android.content.Context
+import android.system.Os.remove
+import android.util.Log
+import android.view.LayoutInflater
+import android.view.View
+import android.widget.CompoundButton
+import android.widget.LinearLayout
+import androidx.fragment.app.Fragment
+import androidx.fragment.app.FragmentTransaction
+import com.alibaba.android.vlayout.DelegateAdapter
+import com.alibaba.android.vlayout.VirtualLayoutManager
+import com.enation.javashop.net.engine.model.NetState
+import com.wdkl.ncs.android.component.nursehome.R
+import com.wdkl.ncs.android.component.nursehome.adapter.BroadcastAdapter
+import com.wdkl.ncs.android.component.nursehome.databinding.FragmentBroadcastBinding
+import com.wdkl.ncs.android.component.nursehome.databinding.FragmentBroadcastHostBinding
+import com.wdkl.ncs.android.component.nursehome.launch.NurseHomeLaunch
+import com.wdkl.ncs.android.lib.base.BaseFragment
+import com.wdkl.ncs.android.lib.utils.showMessage
+import com.wdkl.ncs.android.middleware.common.Constant
+import com.wdkl.ncs.android.middleware.common.MessageEvent
+import com.wdkl.ncs.android.middleware.logic.contract.nursehome.BroadcastContract
+import com.wdkl.ncs.android.middleware.logic.contract.nursehome.NurseHomeActivityContract
+import com.wdkl.ncs.android.middleware.logic.presenter.nursehome.BroadcastPresenter
+import com.wdkl.ncs.android.middleware.model.dos.BroadcastDO
+import com.wdkl.ncs.android.middleware.tcp.dto.TcpModel
+import kotlinx.android.synthetic.main.activity_frame_bed_info.*
+
+import kotlinx.android.synthetic.main.add_the_timing.*
+import kotlinx.android.synthetic.main.add_the_timing.view.*
+import kotlinx.android.synthetic.main.fragment_broadcast.*
+import kotlinx.android.synthetic.main.fragment_broadcast_host.*
+import kotlinx.android.synthetic.main.view_title_layout.*
+import kotlinx.android.synthetic.main.view_title_layout.view_title_layout_return
+import org.greenrobot.eventbus.EventBus
+import org.greenrobot.eventbus.Subscribe
+import org.greenrobot.eventbus.ThreadMode
+
+/**
+ * 广播管理界面
+ */
+class BroadcastNewFragment : BaseFragment<BroadcastPresenter, FragmentBroadcastHostBinding>(), BroadcastContract.View {
+
+
+    var TAG = BroadcastNewFragment::class.java.getSimpleName()
+    /**
+     * 提供layoutID
+     */
+    override fun getLayId(): Int {
+        return R.layout.fragment_broadcast_host
+    }
+
+    /**
+     *初始化依赖注入
+     */
+    override fun bindDagger() {
+        NurseHomeLaunch.component.inject(this)
+    }
+
+    /**
+     *初始化操作
+     */
+    override fun init() {
+        val broadcastListFragment = BroadcastListFragment()
+        setui(1)
+        val transaction = childFragmentManager.beginTransaction()
+        transaction.replace(R.id.br_frame, broadcastListFragment)
+        transaction.commit()
+    }
+
+    /**
+     *绑定事件
+     */
+    override fun bindEvent() {
+
+        //广播列表
+        ll_gb_bt.setOnClickListener {
+            val broadcastListFragment = BroadcastListFragment()
+            setui(1)
+            val transaction = childFragmentManager.beginTransaction()
+            transaction.replace(R.id.br_frame, broadcastListFragment)
+            transaction.commit()
+        }
+        //喊话广播
+        ll_hh_bt.setOnClickListener {
+            val broadcasthhFragment = BroadcasthhFragment()
+            setui(2)
+            val transaction = childFragmentManager.beginTransaction()
+            transaction.replace(R.id.br_frame, broadcasthhFragment)
+            transaction.commit()
+        }
+        //更多功能
+        ll_tj_bt.setOnClickListener {
+            showMessage("期待更多")
+        }
+
+    }
+
+    private fun  setui(int: Int){
+        ll_gb_bt.setBackgroundResource(R.drawable.shape_bed_bg)
+        ll_gb_bt_img.setBackgroundResource(R.mipmap.jr)
+        ll_gb_bt_tx.setTextColor(getResources().getColor(R.color.text_name_color))
+
+        ll_hh_bt.setBackgroundResource(R.drawable.shape_bed_bg)
+        ll_hh_bt_img.setBackgroundResource(R.mipmap.jr)
+        ll_hh_bt_tx.setTextColor(getResources().getColor(R.color.black))
+
+        ll_tj_bt.setBackgroundResource(R.drawable.shape_bed_bg)
+        ll_tj_bt_img.setBackgroundResource(R.mipmap.jr)
+        ll_tj_bt_tx.setTextColor(getResources().getColor(R.color.black))
+        when (int) {
+
+             1-> {
+                //广播列表
+                ll_gb_bt.setBackgroundResource(R.drawable.shape_bt_main_list_bg)
+                 ll_gb_bt_img.setBackgroundResource(R.mipmap.jian_bai)
+                ll_gb_bt_tx.setTextColor(getResources().getColor(R.color.white));
+            }
+
+            2 -> {
+                //喊话广播
+                ll_hh_bt.setBackgroundResource(R.drawable.shape_bt_main_hh_bg)
+                ll_hh_bt_img.setBackgroundResource(R.mipmap.jian_bai)
+                ll_hh_bt_tx.setTextColor(getResources().getColor(R.color.white))
+            }
+        }
+    }
+
+    /**
+     *页面销毁回调
+     */
+    override fun destory() {
+    }
+
+    /**
+     *显示数据
+     */
+    override fun showData(data: ArrayList<BroadcastDO>) {
+    }
+
+    /**
+     *处理错误信息
+     */
+    override fun onError(message: String, type: Int) {
+    }
+
+    /**
+     *耗时加载完成
+     */
+    override fun complete(message: String, type: Int) {
+    }
+
+    /**
+     *耗时加载开始
+     */
+    override fun start() {
+    }
+
+    /**
+     *处理网络状态
+     */
+    override fun networkMonitor(state: NetState) {
+    }
+    override fun onStart() {
+        super.onStart()
+        if (!EventBus.getDefault().isRegistered(this)) {
+            // 未注册的逻辑处理
+            EventBus.getDefault().register(this)
+        }
+
+    }
+
+    override fun onStop() {
+        super.onStop()
+        if (EventBus.getDefault().isRegistered(this)) {
+            // 已注册的逻辑处理
+            EventBus.getDefault().unregister(this)
+        }
+
+    }
+    @Subscribe(threadMode = ThreadMode.MAIN)
+    fun onMoonEvent(messageEvent: MessageEvent) {
+//        Log.e(TAG,"收到tcp消息")
+//        if (Constant.EVENT_V_br_set == messageEvent.type) {
+//            val BroadcastSetFragment = BroadcastSetFragment()
+//            val transaction = childFragmentManager.beginTransaction()
+//            transaction.replace(R.id.br_frame, BroadcastSetFragment)
+//            transaction.commit()
+//        }
+    }
+}
+
+

+ 523 - 0
android_host/src/main/java/com/wdkl/ncs/android/component/nursehome/fragment/BroadcastSetFragment.kt

@@ -0,0 +1,523 @@
+package com.wdkl.ncs.android.component.nursehome.fragment
+
+import android.graphics.Color
+import android.text.Editable
+import android.text.TextWatcher
+import android.view.View
+import android.widget.TextView
+import androidx.fragment.app.Fragment
+import androidx.recyclerview.widget.GridLayoutManager
+import androidx.recyclerview.widget.LinearLayoutManager
+import com.alibaba.android.vlayout.DelegateAdapter
+import com.alibaba.android.vlayout.VirtualLayoutManager
+import com.bigkoo.pickerview.builder.TimePickerBuilder
+import com.enation.javashop.net.engine.model.NetState
+import com.wdkl.ncs.android.component.nursehome.R
+import com.wdkl.ncs.android.component.nursehome.adapter.BrGroupAdapter
+import com.wdkl.ncs.android.component.nursehome.databinding.FragmentBrSetBinding
+import com.wdkl.ncs.android.component.nursehome.launch.NurseHomeLaunch
+import com.wdkl.ncs.android.lib.base.BaseFragment
+import com.wdkl.ncs.android.lib.utils.TimeHandle
+import com.wdkl.ncs.android.lib.utils.showMessage
+import com.wdkl.ncs.android.middleware.common.Constant
+import com.wdkl.ncs.android.middleware.common.MessageEvent
+import com.wdkl.ncs.android.middleware.logic.contract.nursehome.BroadcastSetContract
+import com.wdkl.ncs.android.middleware.logic.presenter.nursehome.BroadcastSetPresenter
+import com.wdkl.ncs.android.middleware.model.vo.BroadcastVO
+import com.wdkl.ncs.android.middleware.model.vo.GroupBrVo
+import kotlinx.android.synthetic.main.fragment_br_set.*
+import org.greenrobot.eventbus.EventBus
+import org.greenrobot.eventbus.Subscribe
+import org.greenrobot.eventbus.ThreadMode
+import java.util.*
+import kotlin.collections.ArrayList
+
+/**
+ * 广播设置界面
+ */
+class BroadcastSetFragment : BaseFragment<BroadcastSetPresenter, FragmentBrSetBinding>(), BroadcastSetContract.View ,BrGroupAdapter.OnItemClickListener{
+
+
+    var TAG = BroadcastSetFragment::class.java.getSimpleName()
+
+    private lateinit var virtualLayoutManager: VirtualLayoutManager
+    private lateinit var delegateAdapter: DelegateAdapter
+
+    //区域适配器
+    private lateinit var adapter: BrGroupAdapter
+
+    private var infoFragment: Fragment? = null
+
+
+
+    var  group_id :Int = 0
+    var br_id :String = ""
+    private var allOrders = ArrayList<GroupBrVo>()
+
+    private var broadcastVO: BroadcastVO? = null
+
+    //广播模式
+    var  broadcastMode :Int = 0
+    //播放开始时间
+    var  playStart :String=""
+    //播放结束时间
+    var  play_end :String=""
+    //播放模式
+    var  playEnd :Int= 0
+    //播放次数
+    var  repeatTimes  :Int= 0
+    //播放日期
+    var  repeatDay :String=""
+    //是否启用
+    var  status :Boolean=false
+    //广播片区
+    var  groupIds :String=""
+    //广播名称
+    var  title :String=""
+
+
+    /**
+     * 提供layoutID
+     */
+    override fun getLayId(): Int {
+        return R.layout.fragment_br_set
+    }
+
+    /**
+     *初始化依赖注入
+     */
+    override fun bindDagger() {
+        NurseHomeLaunch.component.inject(this)
+    }
+
+    /**
+     *初始化操作
+     */
+    override fun init() {
+        br_id = arguments?.getString("id").toString()
+        adapter = BrGroupAdapter(activity, ArrayList())
+        val layoutManager = GridLayoutManager(activity, 4, LinearLayoutManager.VERTICAL, false)
+        info_f_ar.layoutManager = layoutManager
+        adapter.setOnItemClickListener(this)
+        info_f_ar.adapter = adapter
+        if (Constant.PART_ID!=null && Constant.PART_ID!=1 ){
+            presenter.loadQyData(Constant.PART_ID)
+        }
+        if (!br_id.equals("")){
+            presenter.loadData(br_id.toInt())
+        }
+
+    }
+
+    /**
+     *绑定事件
+     */
+    override fun bindEvent() {
+
+        //返回
+        br_retun_bt.setOnClickListener {
+            EventBus.getDefault().post(MessageEvent("finish", Constant.EVENT_r_br_set))
+        }
+        //修改
+        br_save_bt.setOnClickListener {
+            if (broadcastVO!=null){
+                //标题
+                title =set_br_ed_name.text.toString()
+
+                //广播模式
+                presenter.loasetData(broadcastVO!!.id, broadcastVO!!.union_id, broadcastVO!!.create_time,
+                        broadcastVO!!.update_time, broadcastVO!!.part_id, broadcastMode, playStart, play_end,
+                        playEnd, repeatTimes, repeatDay, status, groupIds, broadcastVO!!.frame_ids?:"", title, broadcastVO!!.audio_port,
+                        broadcastVO!!.video_port, broadcastVO!!.room_no)
+            }
+        }
+
+        set_br_number_ed.addTextChangedListener(object : TextWatcher {
+
+            override fun beforeTextChanged(s: CharSequence?, start: Int, count: Int, after: Int) {
+
+            }
+
+            override fun onTextChanged(s: CharSequence?, start: Int, before: Int, count: Int) {
+
+            }
+
+            override fun afterTextChanged(s: Editable) {
+                // 文本变化后执行的操作
+                //播放次数
+             repeatTimes =  s.toString().toIntOrNull() ?: 0
+
+
+
+            }
+        })
+        //广播模式
+        group_br_type_ll.setOnCheckedChangeListener { group, checkedId ->
+            if (checkedId == R.id.radio_sd) {
+                broadcastMode =1
+                setui(1)
+
+            } else if (checkedId == R.id.radio_zd) {
+                broadcastMode =2
+                setui(2)
+            }
+        }
+        //播放模式
+        group_br_play_type_ll.setOnCheckedChangeListener { group, checkedId ->
+            if (checkedId == R.id.radio_ds) {
+                playEnd =1
+                setui(3)
+            } else if (checkedId == R.id.radio_dc) {
+                playEnd =2
+                setui(4)
+            }
+        }
+        //是否启用
+        radio_qy.setOnCheckedChangeListener { buttonView, isChecked ->
+            status = isChecked
+        }
+        //播放日期
+        setupTextViewClickListeners(mViewDataBinding,0)
+
+        //播放开始时间
+        set_br_time_out_ll.setOnClickListener{
+            showTimeSelect(0)
+        }
+        //播放结束时间
+        set_br_time_end_ll.setOnClickListener{
+            showTimeSelect(1)
+        }
+
+
+
+
+
+    }
+
+    private fun  setui(type: Int){
+        if (type==1){
+            //手动模式
+            radio_ds.isChecked = false
+            radio_ds.isEnabled =false
+            radio_dc.isChecked = false
+            radio_dc.isEnabled =false
+            set_br_number_ed.isEnabled =false
+            set_br_number_ed.setText("0")
+            setupTextViewClickListeners(mViewDataBinding,1)
+
+            set_br_time_out_ll.isEnabled =false
+            set_br_time_out_ll.setBackgroundResource(R.drawable.shape_br_time_ll_bg)
+            set_br_time_out.setTextColor(resources.getColor(R.color.text_name_color))
+            set_br_time_out_img.setImageResource(R.mipmap.xia_h)
+            playStart="00:00:00"
+            set_br_time_out.setText(playStart.substring(0, 5))
+
+            set_br_time_end_ll.isEnabled =false
+            set_br_time_end_ll.setBackgroundResource(R.drawable.shape_br_time_ll_bg)
+            set_br_time_end.setTextColor(resources.getColor(R.color.text_name_color))
+            set_br_time_end_img.setImageResource(R.mipmap.xia_h)
+            play_end="00:00:00"
+            set_br_time_end.setText(play_end.substring(0, 5))
+
+        }else if(type==2){
+            //自动模式
+            radio_ds.isEnabled =true
+            radio_dc.isEnabled =true
+            set_br_number_ed.isEnabled =true
+            set_br_number_ed.setText("0")
+            setupTextViewClickListeners(mViewDataBinding,2)
+
+            set_br_time_out_ll.isEnabled =true
+            set_br_time_out_ll.setBackgroundResource(R.drawable.shape_n_login_ed_bg2)
+            set_br_time_out.setTextColor(resources.getColor(R.color.txt_number))
+            set_br_time_out_img.setImageResource(R.mipmap.xia)
+
+            set_br_time_end_ll.isEnabled =true
+            set_br_time_end_ll.setBackgroundResource(R.drawable.shape_n_login_ed_bg2)
+            set_br_time_end.setTextColor(resources.getColor(R.color.txt_number))
+            set_br_time_end_img.setImageResource(R.mipmap.xia)
+
+
+        }else if(type==3){
+            //定时播放
+            set_br_number_ed.isEnabled =false
+            set_br_number_ed.setText("0")
+
+            set_br_time_end_ll.isEnabled =true
+            set_br_time_end_ll.setBackgroundResource(R.drawable.shape_n_login_ed_bg2)
+            set_br_time_end.setTextColor(resources.getColor(R.color.txt_number))
+            set_br_time_end_img.setImageResource(R.mipmap.xia)
+
+
+        }else if(type==4){
+            //定次播放
+            set_br_number_ed.isEnabled =true
+            set_br_number_ed.setText("0")
+
+            set_br_time_end_ll.isEnabled =false
+            set_br_time_end_ll.setBackgroundResource(R.drawable.shape_br_time_ll_bg)
+            set_br_time_end.setTextColor(resources.getColor(R.color.text_name_color))
+            set_br_time_end_img.setImageResource(R.mipmap.xia_h)
+            play_end="00:00:00"
+            set_br_time_end.setText(play_end.substring(0, 5))
+        }
+
+    }
+    override fun onItemClick(view: View, keyId: Int, ids: String) {
+//        showMessage("设置成功"+ids)
+        groupIds = ids
+    }
+    /**
+     *页面销毁回调
+     */
+    override fun destory() {
+    }
+
+    /**
+     *显示数据
+     */
+    override fun showData(data: BroadcastVO) {
+        if (data!=null){
+            broadcastVO =data
+            //广播模式
+            broadcastMode  = data.broadcast_mode
+            //播放开始时间
+              playStart =data.play_start
+            //播放结束时间
+              play_end =data.play_end
+            //播放模式
+              playEnd = data.play_mode?:0
+            //播放次数
+            repeatTimes  = data.repeat_times?:0
+            //播放日期
+              repeatDay =data.repeat_day?:""
+            //是否启用
+              status =data.isStatus
+            //广播片区
+              groupIds =data.group_ids?:""
+            //广播名称
+              title =data.title
+            set_br_ed_name.setText(data.title)
+
+            if (data.play_mode!=null && data.play_mode==1){
+                radio_ds.isChecked= true
+            }else if (data.play_mode!=null && data.play_mode==2){
+                radio_dc.isChecked= true
+            }
+
+            if (data.isStatus){
+                radio_qy.isChecked= true
+            }
+            if ( data.repeat_times!=null){
+                set_br_number_ed.setText(data.repeat_times.toString())
+            }
+            if (!data.play_start.equals("")){
+                set_br_time_out.text =data.play_start.substring(0, 5)
+            }
+            if (!data.play_end.equals("")){
+                set_br_time_end.text =data.play_end.substring(0, 5)
+            }
+            setWeekDays(data.repeat_day ?: "")
+
+            adapter.matchAndChangeBackground(data.group_ids ?: "")
+
+            if (data.broadcast_mode==1){
+                radio_sd.isChecked= true
+                setui(1)
+            }else{
+                radio_zd.isChecked= true
+            }
+
+        }
+    }
+
+    override fun showQyData(data: ArrayList<GroupBrVo>) {
+        if (data != null) {
+            allOrders.clear()
+            allOrders = data
+            adapter.updateData(data)
+        }
+    }
+
+    override fun showsetData(data: BroadcastVO) {
+        if (data!=null){
+            showMessage("设置成功")
+            EventBus.getDefault().post(MessageEvent("finish", Constant.EVENT_r_br_set))
+        }
+
+
+    }
+
+
+    private fun setupTextViewClickListeners(binding: FragmentBrSetBinding, inputParam: Int) {
+        val textViewList = listOf<TextView>(
+                binding.setBrTx3,
+                binding.setBrTx4,
+                binding.setBrTx5,
+                binding.setBrTx6,
+                binding.setBrTx7,
+                binding.setBrTx8,
+                binding.setBrTx9
+        )
+
+        val clickedTextViews = mutableListOf<Int>()
+
+        for (i in 0 until textViewList.size) {
+            val textView = textViewList[i]
+            if (inputParam == 1) {
+                // 将所有控件背景重置为 R.drawable.shape_time_f_bg,并禁用点击
+                textView.setBackgroundResource(R.drawable.shape_time_f_bg)
+                textView.setTextColor(Color.parseColor("#B4B4B4"))
+                textView.isEnabled = false
+                repeatDay =""
+            } else if (inputParam == 2) {
+                // 设置所有控件为可选状态
+                textView.isEnabled = true
+            }
+            textView.setOnClickListener {
+                val clickedIndex = clickedTextViews.indexOf(i)
+                if (clickedIndex >= 0) {
+                    clickedTextViews.removeAt(clickedIndex)
+                    textView.setBackgroundResource(R.drawable.shape_time_f_bg)
+                    textView.setTextColor(Color.parseColor("#B4B4B4"))
+                    val output = clickedTextViews.joinToString(",") { if (it == 6) "0" else (it + 1).toString() }
+//                    showMessage(output)
+                    repeatDay =output
+                } else {
+                    clickedTextViews.add(i)
+                    textView.setBackgroundResource(R.drawable.shape_time_f_bg_d)
+                    textView.setTextColor(Color.parseColor("#0090ff"))
+                    val output = clickedTextViews.joinToString(",") { if (it == 6) "0" else (it + 1).toString() }
+                    repeatDay =output
+//                    showMessage(output)
+                }
+            }
+        }
+
+
+    }
+
+    /**
+     * 显示时间选择
+     * 0 start 1 end
+     */
+    private fun showTimeSelect(i: Int) {
+        val imePickerView = TimePickerBuilder(getActivity()) { date: Date?, v: View? ->
+            if (i == 0) {
+                playStart = TimeHandle.getDataTimes("HH:mm:ss", date!!)
+                set_br_time_out.setText(playStart.substring(0, 5))
+            } else {
+                play_end = TimeHandle.getDataTimes("HH:mm:ss", date!!)
+                set_br_time_end.setText(play_end.substring(0, 5))
+            }
+        }.setType(booleanArrayOf(false, false, false, true, true, false)).build()
+        imePickerView.show()
+    }
+
+    fun setWeekDays(weekString: String) {
+        if (weekString.isEmpty()) return
+        val weekMap: Map<Char, String> = mapOf(
+                '1' to "周一",
+                '2' to "周二",
+                '3' to "周三",
+                '4' to "周四",
+                '5' to "周五",
+                '6' to "周六",
+                '0' to "周日"
+        )
+
+        val selectedDays = weekString.split(",")
+                .mapNotNull { weekMap[it.firstOrNull() ?: ' '] }
+                .distinct()
+                .sortedBy { weekMap.keys.indexOf(weekMap.entries.firstOrNull { e -> e.value == it }?.key) }
+
+        if (selectedDays.contains("周一")) {
+            set_br_tx_3.setBackgroundResource(R.drawable.shape_time_f_bg_d)
+            set_br_tx_3.setTextColor(Color.parseColor("#0090ff"))
+            set_br_tx_3.isSelected = true
+        }
+        if (selectedDays.contains("周二")) {
+            set_br_tx_4.setBackgroundResource(R.drawable.shape_time_f_bg_d)
+            set_br_tx_4.setTextColor(Color.parseColor("#0090ff"))
+            set_br_tx_4.isSelected = true
+        }
+        if (selectedDays.contains("周三")) {
+            set_br_tx_5.setBackgroundResource(R.drawable.shape_time_f_bg_d)
+            set_br_tx_5.setTextColor(Color.parseColor("#0090ff"))
+            set_br_tx_5.isSelected = true
+        }
+        if (selectedDays.contains("周四")) {
+            set_br_tx_6.setBackgroundResource(R.drawable.shape_time_f_bg_d)
+            set_br_tx_6.setTextColor(Color.parseColor("#0090ff"))
+            set_br_tx_6.isSelected = true
+        }
+        if (selectedDays.contains("周五")) {
+            set_br_tx_7.setBackgroundResource(R.drawable.shape_time_f_bg_d)
+            set_br_tx_7.setTextColor(Color.parseColor("#0090ff"))
+            set_br_tx_7.isSelected = true
+        }
+        if (selectedDays.contains("周六")) {
+            set_br_tx_8.setBackgroundResource(R.drawable.shape_time_f_bg_d)
+            set_br_tx_8.setTextColor(Color.parseColor("#0090ff"))
+            set_br_tx_8.isSelected = true
+        }
+        if (selectedDays.contains("周日")) {
+            set_br_tx_9.setBackgroundResource(R.drawable.shape_time_f_bg_d)
+            set_br_tx_9.setTextColor(Color.parseColor("#0090ff"))
+            set_br_tx_9.isSelected = true
+        }
+
+    }
+    /**
+     *处理错误信息
+     */
+    override fun onError(message: String, type: Int) {
+        showMessage(message)
+    }
+
+    /**
+     *耗时加载完成
+     */
+    override fun complete(message: String, type: Int) {
+    }
+
+    /**
+     *耗时加载开始
+     */
+    override fun start() {
+    }
+
+    /**
+     *处理网络状态
+     */
+    override fun networkMonitor(state: NetState) {
+    } override fun onStart() {
+        super.onStart()
+        if (!EventBus.getDefault().isRegistered(this)) {
+            // 未注册的逻辑处理
+            EventBus.getDefault().register(this)
+        }
+
+    }
+
+    override fun onStop() {
+        super.onStop()
+        if (EventBus.getDefault().isRegistered(this)) {
+            // 已注册的逻辑处理
+            EventBus.getDefault().unregister(this)
+        }
+
+    }
+
+    @Subscribe(threadMode = ThreadMode.MAIN)
+    fun onMoonEvent(messageEvent: MessageEvent) {
+//        Log.e(TAG,"收到tcp消息")
+//        var messageEvent = messageEvent.getMessage() as TcpModel
+//        if(messageEvent.getAction() === TcpAction.EventAction.KEY_CLICK){
+//
+//            Log.e(TAG,"收到tcp消息"+messageEvent.toJson())
+//        }
+    }
+
+
+}

+ 272 - 0
android_host/src/main/java/com/wdkl/ncs/android/component/nursehome/fragment/BroadcasthhFragment.kt

@@ -0,0 +1,272 @@
+package com.wdkl.ncs.android.component.nursehome.fragment
+
+import android.content.Context
+import android.util.Log
+import android.view.LayoutInflater
+import android.view.View
+import android.widget.CompoundButton
+import android.widget.LinearLayout
+import androidx.fragment.app.Fragment
+import androidx.recyclerview.widget.GridLayoutManager
+import androidx.recyclerview.widget.LinearLayoutManager
+import com.alibaba.android.vlayout.DelegateAdapter
+import com.alibaba.android.vlayout.VirtualLayoutManager
+import com.alibaba.fastjson.JSONObject
+import com.enation.javashop.net.engine.model.NetState
+import com.wdkl.gstreamer.demo.MyGStreamManager
+import com.wdkl.ncs.android.component.nursehome.R
+import com.wdkl.ncs.android.component.nursehome.activity.NurseHomeActivity
+import com.wdkl.ncs.android.component.nursehome.adapter.BrGroupAdapter
+import com.wdkl.ncs.android.component.nursehome.adapter.BroadcastAdapter
+import com.wdkl.ncs.android.component.nursehome.databinding.FragmentBrCallBinding
+import com.wdkl.ncs.android.component.nursehome.databinding.FragmentBroadcastBinding
+import com.wdkl.ncs.android.component.nursehome.databinding.FragmentBroadcastHostBinding
+import com.wdkl.ncs.android.component.nursehome.launch.NurseHomeLaunch
+import com.wdkl.ncs.android.lib.base.BaseFragment
+import com.wdkl.ncs.android.lib.utils.showMessage
+import com.wdkl.ncs.android.middleware.common.Constant
+import com.wdkl.ncs.android.middleware.common.MessageEvent
+import com.wdkl.ncs.android.middleware.logic.contract.nursehome.BroadcastContract
+import com.wdkl.ncs.android.middleware.logic.contract.nursehome.BroadcasthhContract
+import com.wdkl.ncs.android.middleware.logic.contract.nursehome.NurseHomeActivityContract
+import com.wdkl.ncs.android.middleware.logic.presenter.nursehome.BroadcastPresenter
+import com.wdkl.ncs.android.middleware.logic.presenter.nursehome.BroadcasthhPresenter
+import com.wdkl.ncs.android.middleware.model.dos.BroadcastDO
+import com.wdkl.ncs.android.middleware.model.vo.ClerkByVO
+import com.wdkl.ncs.android.middleware.model.vo.GroupBrVo
+import com.wdkl.ncs.android.middleware.tcp.TcpClient
+import com.wdkl.ncs.android.middleware.tcp.channel.BroadcastUtil
+import com.wdkl.ncs.android.middleware.tcp.dto.TcpCallback
+import com.wdkl.ncs.android.middleware.tcp.dto.TcpModel
+import kotlinx.android.synthetic.main.activity_frame_bed_info.*
+
+import kotlinx.android.synthetic.main.add_the_timing.*
+import kotlinx.android.synthetic.main.add_the_timing.view.*
+import kotlinx.android.synthetic.main.fragment_br_call.*
+import kotlinx.android.synthetic.main.fragment_broadcast.*
+import kotlinx.android.synthetic.main.fragment_broadcast_host.*
+import kotlinx.android.synthetic.main.fragment_broadcast_host.ll_gb_bt
+import kotlinx.android.synthetic.main.view_title_layout.*
+import kotlinx.android.synthetic.main.view_title_layout.view_title_layout_return
+import org.greenrobot.eventbus.Subscribe
+import org.greenrobot.eventbus.ThreadMode
+
+/**
+ * 喊话广播界面
+ */
+class BroadcasthhFragment : BaseFragment<BroadcasthhPresenter, FragmentBrCallBinding>(), BroadcasthhContract.View,BrGroupAdapter.OnItemClickListener {
+
+
+    var TAG = BroadcasthhFragment::class.java.getSimpleName()
+
+    private lateinit var virtualLayoutManager: VirtualLayoutManager
+    private lateinit var delegateAdapter: DelegateAdapter
+
+    //区域适配器
+    private lateinit var adapter: BrGroupAdapter
+
+    private var infoFragment: Fragment? = null
+    var  group_id :String = ""
+    private var allOrders = ArrayList<GroupBrVo>()
+
+    private var bcVoiceOn = false
+    private var initDone = false
+
+    /**
+     * 提供layoutID
+     */
+    override fun getLayId(): Int {
+        return R.layout.fragment_br_call
+    }
+
+    /**
+     *初始化依赖注入
+     */
+    override fun bindDagger() {
+        NurseHomeLaunch.component.inject(this)
+    }
+
+    /**
+     *初始化操作
+     */
+    override fun init() {
+        adapter = BrGroupAdapter(activity, ArrayList())
+        val layoutManager = GridLayoutManager(activity, 4, LinearLayoutManager.VERTICAL, false)
+        call_bt_rv.layoutManager = layoutManager
+        adapter.setOnItemClickListener(this)
+        call_bt_rv.adapter = adapter
+        if (Constant.PART_ID!=null && Constant.PART_ID!=1 ){
+            presenter.loadData(Constant.PART_ID)
+        }
+    }
+
+    /**
+     *绑定事件
+     */
+    override fun bindEvent() {
+
+        //喊话广播
+        call_bt_call.setOnClickListener {
+
+//            if (group_id.equals("")){
+//                showMessage("请选择喊话区域")
+//            }else
+
+            if (Constant.bcStart) {
+            showMessage(R.string.broadcast_playing)
+            } else if (!Constant.gstreamer_init) {
+                tv_broadcast_title.setText(R.string.broadcast_init_error)
+            } else {
+                MyGStreamManager.getInstance().setCallBack(object : MyGStreamManager.StreamerCallBack {
+                    override fun onMessage(message: String?) {
+                        Log.d(TAG, "广播 ==> onMessage: $message")
+                    }
+
+                    override fun onStreamerInitialized() {
+                        Log.d(TAG, "广播 ==> 初始化完成...开始喊话")
+                        initDone = true
+
+                        activity.runOnUiThread {
+                            tv_broadcast_title.setText(R.string.broadcast_playing)
+                            btn_record.setBackgroundResource(R.drawable.mic_off)
+                            tv_record.setText(R.string.broadcast_record_stop)
+                            call_bt_call.visibility =View.GONE
+                            call_bt_bt.visibility =View.VISIBLE
+                            my_voice_load_view.start()
+                            showMessage(R.string.broadcast_record_start)
+                            bcVoiceOn = true
+                        }
+
+                        MyGStreamManager.getInstance().play()
+                    }
+                })
+                    //先发起喊话广播请求,服务端返回端口再初始化
+                    val tcpModel = BroadcastUtil.startVoiceBroadcast(Constant.DEVICE_ID, "[0]")  //给所有分机设备发
+                    val transaction = object : TcpCallback(tcpModel.tid) {
+                        override fun onSuccess(jsonObject: JSONObject) {
+                            try {
+                                val port = jsonObject.get(CALLBACK_DATA)
+                                //gstream初始化,指定服务器 IP 和端口
+                                val uri = "host=" + Constant.RTC_URL + " port=" + Constant.RTC_port
+
+                                MyGStreamManager.getInstance().init(uri)
+                            } catch (ex: Exception) {
+                                ex.printStackTrace()
+                            }
+                        }
+
+                        override fun onFailed(jsonObject: JSONObject) {
+                            // 这里写发送失败的方法
+                            activity.runOnUiThread {
+                                showMessage("broadcast send fail")
+                            }
+                        }
+                    }
+                    TcpClient.getInstance().sendTcp(tcpModel, false, transaction)
+                }
+        }
+        //挂断
+        call_bt_bt.setOnClickListener {
+            (activity as NurseHomeActivity).showHome(false)
+        }
+
+        btn_record.setOnClickListener {
+            if (!Constant.gstreamer_init) {
+                tv_broadcast_title.setText(R.string.broadcast_init_error)
+                showMessage(R.string.broadcast_init_error)
+            } else if (!initDone) {
+                tv_broadcast_title.setText(R.string.broadcast_start_warning)
+                showMessage(R.string.broadcast_start_warning)
+            } else {
+                if (!bcVoiceOn) {
+                    //start broadcast
+                    tv_broadcast_title.setText(R.string.broadcast_playing)
+                    btn_record.setBackgroundResource(R.drawable.mic_off)
+                    tv_record.setText(R.string.broadcast_record_stop)
+                    bcVoiceOn = true
+
+                    MyGStreamManager.getInstance().play()
+                    my_voice_load_view.start()
+                } else {
+                    //stop broadcast
+                    tv_broadcast_title.setText(R.string.broadcast_stop)
+                    btn_record.setBackgroundResource(R.drawable.mic_on)
+                    tv_record.setText(R.string.broadcast_record_start)
+                    bcVoiceOn = false
+
+                    MyGStreamManager.getInstance().pause()
+                    my_voice_load_view.stop()
+                }
+            }
+        }
+
+    }
+
+    private fun  setui(){
+
+    }
+
+    /**
+     *页面销毁回调
+     */
+    override fun destory() {
+        if (initDone && !Constant.bcStart) {
+            val tcpModel = BroadcastUtil.stopBroadcast(Constant.DEVICE_ID, Constant.bcInteractionId)
+            TcpClient.getInstance().sendMsg(tcpModel.toJson())
+        }
+        MyGStreamManager.getInstance().release()
+    }
+
+    /**
+     *显示数据
+     */
+    override fun showData(data: ArrayList<GroupBrVo>) {
+        if (data != null) {
+            allOrders.clear()
+            allOrders = data
+            adapter.updateData(data)
+        }
+    }
+
+    /**
+     *处理错误信息
+     */
+    override fun onError(message: String, type: Int) {
+    }
+
+    /**
+     *耗时加载完成
+     */
+    override fun complete(message: String, type: Int) {
+    }
+
+    /**
+     *耗时加载开始
+     */
+    override fun start() {
+    }
+
+    /**
+     *处理网络状态
+     */
+    override fun networkMonitor(state: NetState) {
+    }
+
+    @Subscribe(threadMode = ThreadMode.MAIN)
+    fun onMoonEvent(messageEvent: MessageEvent) {
+//        Log.e(TAG,"收到tcp消息")
+//        var messageEvent = messageEvent.getMessage() as TcpModel
+//        if(messageEvent.getAction() === TcpAction.EventAction.KEY_CLICK){
+//
+//            Log.e(TAG,"收到tcp消息"+messageEvent.toJson())
+//        }
+    }
+
+    override fun onItemClick(view: View, keyId: Int, ids: String) {
+        if (!ids.equals("")){
+            group_id = ids
+        }else{
+            group_id = ""
+        }
+    }
+}

+ 6 - 6
android_host/src/main/java/com/wdkl/ncs/android/component/nursehome/fragment/CallRecordsFragment.kt

@@ -123,7 +123,7 @@ class CallRecordsFragment: BaseFragment<CallRecordsFragmentPresenter, FragmentCa
 
         callingAdapter?.setUpdateCallback(this)
 
-        presenter.loadFloor(page, pageSize, Constant.part_id, listType, eventName)
+        presenter.loadFloor(page, pageSize, Constant.PART_ID, listType, eventName)
 
         language = LocaleMangerUtils.getApplicationLocale().language
     }
@@ -154,7 +154,7 @@ class CallRecordsFragment: BaseFragment<CallRecordsFragmentPresenter, FragmentCa
                 if (listType != 1) {
                     page = 1
                     listType = 1
-                    presenter.loadFloor(page, pageSize, Constant.part_id, listType, eventName)
+                    presenter.loadFloor(page, pageSize, Constant.PART_ID, listType, eventName)
                 }
             }
 
@@ -174,7 +174,7 @@ class CallRecordsFragment: BaseFragment<CallRecordsFragmentPresenter, FragmentCa
                 if (listType != 0) {
                     page = 1
                     listType = 0
-                    presenter.loadFloor(page, pageSize, Constant.part_id, listType, eventName)
+                    presenter.loadFloor(page, pageSize, Constant.PART_ID, listType, eventName)
                 }
             }
 
@@ -306,18 +306,18 @@ class CallRecordsFragment: BaseFragment<CallRecordsFragmentPresenter, FragmentCa
         //下拉刷新
         mViewDataBinding.refresh.setOnRefreshListener {
             page = 1
-            presenter.loadFloor(page, pageSize, Constant.part_id, listType, eventName)
+            presenter.loadFloor(page, pageSize, Constant.PART_ID, listType, eventName)
         }
         //上拉加载更多
         mViewDataBinding.refresh.setOnLoadMoreListener {
             page += 1
-            presenter.loadFloor(page, pageSize, Constant.part_id, listType, eventName)
+            presenter.loadFloor(page, pageSize, Constant.PART_ID, listType, eventName)
         }
     }
 
     private fun updateRecord() {
         page = 1
-        presenter.loadFloor(page, pageSize, Constant.part_id, listType, eventName)
+        presenter.loadFloor(page, pageSize, Constant.PART_ID, listType, eventName)
     }
 
     override fun networkMonitor(state: NetState) {

+ 2 - 2
android_host/src/main/java/com/wdkl/ncs/android/component/nursehome/fragment/DoctorHostFragment.kt

@@ -73,8 +73,8 @@ class DoctorHostFragment: BaseFragment<DoctorHostPresenter, FragmentDoctorHostBi
         doctor_host_recyv.layoutManager = virtualLayoutManager
         doctor_host_recyv.adapter = delegateAdapter
 
-        if (Constant.part_id != -1) {
-            presenter.loadDoctorHost(DeviceTypeEnum.DOCTOR_HOST.value(), Constant.part_id)
+        if (Constant.PART_ID != -1) {
+            presenter.loadDoctorHost(DeviceTypeEnum.DOCTOR_HOST.value(), Constant.PART_ID)
         }
 
     }

+ 3 - 3
android_host/src/main/java/com/wdkl/ncs/android/component/nursehome/fragment/FramePartFragment.kt

@@ -98,7 +98,7 @@ class FramePartFragment: BaseFragment<FramePartPresenter, FragmentFramePartBindi
         listView.layoutManager = virtualLayoutManager
         listView.adapter = delegateAdapter
 
-        presenter.loadData(Constant.part_id)
+        presenter.loadData(Constant.PART_ID)
 
     }
     /**
@@ -206,7 +206,7 @@ class FramePartFragment: BaseFragment<FramePartPresenter, FragmentFramePartBindi
      */
     private fun configRefresh(){
         refresh.setOnRefreshListener {
-            presenter.loadData(Constant.part_id)
+            presenter.loadData(Constant.PART_ID)
         }
     }
 
@@ -258,7 +258,7 @@ class FramePartFragment: BaseFragment<FramePartPresenter, FragmentFramePartBindi
                 var tcpModel = messageEvent.getMessage() as TcpModel
                 if (tcpModel.action == TcpAction.DataAction.REFRESH) {
                     //更新数据
-                    presenter.loadData(Constant.part_id)
+                    presenter.loadData(Constant.PART_ID)
 
                 }
             }

+ 2 - 2
android_host/src/main/java/com/wdkl/ncs/android/component/nursehome/fragment/NurseMoveFragment.kt

@@ -94,8 +94,8 @@ class NurseMoveFragment : BaseFragment<NurseMovePresenter,FragmentYdHostBinding>
         yd_listView.layoutManager = bedVirtualLayoutManager
         yd_listView.adapter = bedDelegateAdapter
 
-        if (Constant.part_id != -1) {
-            presenter.getMobileDevice(Constant.part_id)
+        if (Constant.PART_ID != -1) {
+            presenter.getMobileDevice(Constant.PART_ID)
         }
         
     }

+ 2 - 2
android_host/src/main/java/com/wdkl/ncs/android/component/nursehome/fragment/OtherHostFragment.kt

@@ -70,8 +70,8 @@ class OtherHostFragment : BaseFragment<OtherHostPresenter, FragmentOtherHostBind
         other_host_recyv.adapter = delegateAdapter
         //加载所有护士主机
                 otherHostAdapter!!.data.clear()
-                if (Constant.part_id != -1) {
-                    presenter.loadAllHostDevice(Constant.part_id)
+                if (Constant.PART_ID != -1) {
+                    presenter.loadAllHostDevice(Constant.PART_ID)
          }
     }
     /**

+ 2 - 2
android_host/src/main/java/com/wdkl/ncs/android/component/nursehome/fragment/SystemSettingsFragment.kt

@@ -216,7 +216,7 @@ class SystemSettingsFragment:BaseFragment<SystemSettingsPresenter, FragmentSyste
         partSettingDO.id = SettingConfiguration.getInstance().id
         partSettingDO.unionId = SettingConfiguration.getInstance().unionId
         partSettingDO.createTime = SettingConfiguration.getInstance().createTime
-        partSettingDO.partId = Constant.part_id
+        partSettingDO.partId = Constant.PART_ID
         partSettingDO.dayStart = SettingConfig. getInitialDayTime(this.activity)+":00"
         partSettingDO.dayLight = SettingConfig.getMainEngineDaytimeBrightness(this.activity)
         //partSettingDO.dayVol = SettingConfig.getHostDaytimeVolume(this.activity)
@@ -772,7 +772,7 @@ class SystemSettingsFragment:BaseFragment<SystemSettingsPresenter, FragmentSyste
 
     override fun showData(data: PartSettingDO) {
         showMessage(R.string.settings_success)
-        (activity as NurseHomeActivity).showHome()
+        (activity as NurseHomeActivity).showHome(true)
     }
 
     /**

+ 3 - 1
android_host/src/main/java/com/wdkl/ncs/android/component/nursehome/fragment/WorkFragment.kt

@@ -33,7 +33,9 @@ import org.greenrobot.eventbus.Subscribe
 import org.greenrobot.eventbus.ThreadMode
 import org.json.JSONObject
 
-
+/**
+ * 更多界面
+ * */
 class WorkFragment : BaseFragment<BedNursingWorkFragmentPresenter, WorkLayBinding>(), BedNursingWorkFragmentContract.View ,DeviceMenuapter.OnItemClickListener{
     val TAG = "WorkFragment"
     val pattern = "\\$([^#]*)#".toRegex()

+ 1 - 0
android_host/src/main/java/com/wdkl/ncs/android/component/nursehome/util/AppUtil.java

@@ -27,6 +27,7 @@ public class AppUtil {
         }
     }
 
+
     /**
      * 设置系统时间
      *

+ 51 - 1
android_host/src/main/java/com/wdkl/ncs/android/component/nursehome/util/MediaPlayHelper.java

@@ -8,6 +8,9 @@ import android.os.Message;
 
 import com.wdkl.ncs.android.lib.base.BaseApplication;
 
+import java.util.ArrayList;
+import java.util.List;
+
 public class MediaPlayHelper {
 
     private static MediaPlayHelper sInstance = null;
@@ -19,6 +22,7 @@ public class MediaPlayHelper {
     private String mUrl;
     private float mVolume;
     private boolean mLoop;
+    private boolean isbr =false;
 
     /**
      * 播放res资源
@@ -37,6 +41,9 @@ public class MediaPlayHelper {
      */
     public static final int RELEASE = 103;
 
+    List<String> urlList = new ArrayList<>();
+    private int currentUrlIndex;
+
 
     private MediaPlayHelper() {
         createHandlerThread();
@@ -98,6 +105,26 @@ public class MediaPlayHelper {
         playHandler.sendEmptyMessage(PLAY_URL);
     }
 
+    public void playSequentialUrls(List<String> urls, float vol, boolean loop) {
+        if (urlList != null) {
+            urlList.clear();
+        }
+        urlList.addAll(urls);
+        mVolume = vol;
+        mLoop = loop;
+        currentUrlIndex = 0;
+        playNextUrl();
+    }
+
+    private void playNextUrl() {
+        if (currentUrlIndex < urlList.size()) {
+            playUrlMusic(urlList.get(currentUrlIndex), mVolume, mLoop);
+            currentUrlIndex++;
+        } else {
+            currentUrlIndex = 0;  // 播放完毕后重置索引,以便下次重新播放
+        }
+    }
+
     public void stopMusic() {
         playHandler.sendEmptyMessage(STOP);
     }
@@ -167,12 +194,22 @@ public class MediaPlayHelper {
                 public void onCompletion(MediaPlayer player) {
                     //playMusicComplete();
                     //stopMusicNow();
+                    if (urlList!=null){
+                        if ( currentUrlIndex < urlList.size()){
+                            playNextUrl();
+                        }else {
+                            if (mCompletionListener != null) {
+                                mCompletionListener.onCompletion();
+                            }
+                        }
+                    }
                 }
             });
             mediaPlayer.setOnErrorListener(new MediaPlayer.OnErrorListener() {
                 @Override
                 public boolean onError(MediaPlayer player, int what, int extra) {
                     //playMusicError();
+
                     stopMusicNow();
                     return false;
                 }
@@ -184,7 +221,7 @@ public class MediaPlayHelper {
         }
     }
 
-    private void stopMusicNow() {
+    public void stopMusicNow() {
         if (mediaPlayer != null) {
             mediaPlayer.setOnPreparedListener(null);
             mediaPlayer.setOnCompletionListener(null);
@@ -222,4 +259,17 @@ public class MediaPlayHelper {
         }
         return false;
     }
+    private OnPlayCompletionListener mCompletionListener;
+
+    public void setOnPlayCompletionListener(OnPlayCompletionListener listener) {
+        mCompletionListener = listener;
+    }
+
+    public void removeOnPlayCompletionListener() {
+        mCompletionListener = null;
+    }
+
+    public interface OnPlayCompletionListener {
+        void onCompletion();
+    }
 }

+ 7 - 2
android_host/src/main/java/com/wdkl/ncs/android/component/nursehome/window/IncidentWindow.kt

@@ -45,7 +45,7 @@ class IncidentWindow(var contexts: Context) {
     private lateinit var delegateAdapter: DelegateAdapter
 
     //创建悬浮按钮
-    fun createFloatView(tcpModel: TcpModel) {
+    fun createFloatView(tcpModel: TcpModel, emergency: Boolean) {
         val interactionVO = Gson().fromJson(tcpModel.data.toString(), InteractionVO::class.java)
         //如果列表中已经存在则不再增加
         for(event in eventTcpList) {
@@ -55,7 +55,12 @@ class IncidentWindow(var contexts: Context) {
             }
         }
 
-        eventTcpList.add(tcpModel)
+
+        if (emergency) {
+            eventTcpList.add(0, tcpModel)
+        } else {
+            eventTcpList.add(tcpModel)
+        }
         //如果当前没有显示则创建view并显示,如果已经显示则仅更新事件列表
         if (view == null) {
             val wmParams = WindowManager.LayoutParams()

二進制
android_host/src/main/res/drawable/ic_broadcast.png


+ 2 - 2
android_host/src/main/res/drawable/radio_button_selector_bg.xml

@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="utf-8"?>
 <selector xmlns:android="http://schemas.android.com/apk/res/android">
     <!-- 选中状态 -->
-    <item android:drawable="@drawable/radiobutton_background_checked_v" android:state_checked="true" />
+    <item android:drawable="@drawable/xuanz" android:state_checked="true" />
     <!-- 未选中状态 -->
-    <item android:drawable="@drawable/radiobutton_background_unchecked" />
+    <item android:drawable="@drawable/wei" />
 </selector>

+ 7 - 0
android_host/src/main/res/drawable/radio_button_selector_bg2.xml

@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8"?>
+<selector xmlns:android="http://schemas.android.com/apk/res/android">
+    <!-- 选中状态 -->
+    <item android:drawable="@drawable/xuanz2" android:state_checked="true" />
+    <!-- 未选中状态 -->
+    <item android:drawable="@drawable/wei" />
+</selector>

+ 1 - 1
android_host/src/main/res/drawable/radio_button_selector_txt.xml

@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="utf-8"?>
 <selector xmlns:android="http://schemas.android.com/apk/res/android">
     <!-- 选中状态 -->
-    <item android:color="#12832e" android:state_checked="true" />
+    <item android:color="#2DBB31" android:state_checked="true" />
     <!-- 未选中状态 -->
     <item android:color="#9A9A9A" />
 </selector>

+ 7 - 0
android_host/src/main/res/drawable/radio_button_selector_txt2.xml

@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="utf-8"?>
+<selector xmlns:android="http://schemas.android.com/apk/res/android">
+    <!-- 选中状态 -->
+    <item android:color="#2F9DF1" android:state_checked="true" />
+    <!-- 未选中状态 -->
+    <item android:color="#9A9A9A" />
+</selector>

+ 9 - 0
android_host/src/main/res/drawable/shape_br_time_ll_bg.xml

@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="utf-8"?>
+<shape xmlns:android="http://schemas.android.com/apk/res/android">
+
+    <solid
+        android:color="#F7F8FC"
+        />
+    <stroke android:width="2dp" android:color="#97A2BE" />
+    <corners android:radius="@dimen/d18" />
+</shape>

+ 8 - 0
android_host/src/main/res/drawable/shape_bt_call_bg.xml

@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8"?>
+<shape xmlns:android="http://schemas.android.com/apk/res/android">
+    <solid android:color="#ff43cb3e"/>
+    <corners
+        android:radius="2dp"
+      />
+
+</shape>

+ 8 - 0
android_host/src/main/res/drawable/shape_bt_main_hh_bg.xml

@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8"?>
+<shape xmlns:android="http://schemas.android.com/apk/res/android">
+    <solid android:color="#FFAF4F"/>
+    <corners
+        android:radius="10dp"
+      />
+
+</shape>

+ 8 - 0
android_host/src/main/res/drawable/shape_bt_main_list_bg.xml

@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="utf-8"?>
+<shape xmlns:android="http://schemas.android.com/apk/res/android">
+    <solid android:color="#66CE7A"/>
+    <corners
+        android:radius="10dp"
+      />
+
+</shape>

+ 9 - 0
android_host/src/main/res/drawable/shape_time_f_bg.xml

@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="utf-8"?>
+<shape xmlns:android="http://schemas.android.com/apk/res/android">
+    <solid android:color="#F4F6F9"/>
+    <stroke android:width="1dp" android:color="#97A2BE" />
+    <corners
+        android:radius="5dp"
+      />
+
+</shape>

+ 9 - 0
android_host/src/main/res/drawable/shape_time_f_bg_d.xml

@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="utf-8"?>
+<shape xmlns:android="http://schemas.android.com/apk/res/android">
+    <solid android:color="#EBF2FE"/>
+    <stroke android:width="3dp" android:color="#0090ff" />
+    <corners
+        android:radius="3dp"
+      />
+
+</shape>

二進制
android_host/src/main/res/drawable/wei.png


二進制
android_host/src/main/res/drawable/xuanz.png


二進制
android_host/src/main/res/drawable/xuanz2.png


+ 0 - 1
android_host/src/main/res/layout/activity_new_nurse_home.xml

@@ -74,7 +74,6 @@
                 android:singleLine="true"
                 android:ellipsize="end"
                 android:text="广播"
-                android:visibility="gone"
                 android:textSize="20sp" />
 
             <TextView

+ 47 - 8
android_host/src/main/res/layout/adapter_broadcasting_frame_part.xml

@@ -2,9 +2,11 @@
 <layout>
     <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
         android:id="@+id/rl_bed_info"
-        android:layout_width="814dp"
-        android:layout_height="115dp"
+        android:layout_width="800dp"
+        android:layout_height="wrap_content"
         android:background="@drawable/shape_bed_bg"
+        android:layout_marginBottom="@dimen/d15"
+        android:paddingBottom="@dimen/d20"
         >
 
         <TextView
@@ -32,13 +34,15 @@
             />
         <TextView
             android:id="@+id/br_region"
-            android:layout_width="wrap_content"
+            android:layout_width="@dimen/d340"
             android:layout_height="wrap_content"
             android:layout_marginLeft="@dimen/d18"
-            android:layout_marginTop="@dimen/d5"
+            android:layout_marginTop="@dimen/d8"
             android:text="广播区域:一区,二区,三区"
             android:layout_below="@+id/br_name"
             android:textSize="@dimen/font_size_18"
+            android:ellipsize="end"
+            android:maxLines="1"
             android:textColor="@color/color_pop_header"
             />
         <TextView
@@ -50,6 +54,8 @@
             android:layout_below="@+id/br_region"
             android:text="广播时间:每天10:00~12:00"
             android:textSize="@dimen/font_size_18"
+            android:ellipsize="end"
+            android:maxLines="1"
             android:textColor="@color/color_pop_header"
             />
 
@@ -59,9 +65,11 @@
             android:layout_height="@dimen/d45"
             android:gravity="center_vertical"
             android:layout_centerVertical="true"
+            android:clickable="true"
             android:layout_toLeftOf="@+id/br_ting"
             android:background="@drawable/shape_other_item_bg"
             android:orientation="horizontal"
+            android:visibility="gone"
             >
 
             <ImageView
@@ -74,12 +82,11 @@
             <TextView
                 android:layout_width="wrap_content"
                 android:layout_height="wrap_content"
+                android:layout_marginLeft="@dimen/d5"
                 android:text="删除"
                 android:textColor="@color/black"
-                android:textStyle="bold"
                 android:textSize="@dimen/font_size_18"
-                android:layout_marginLeft="@dimen/d5"
-                />
+                android:textStyle="bold" />
         </LinearLayout>
         <LinearLayout
             android:id="@+id/br_ting"
@@ -89,6 +96,7 @@
             android:layout_centerVertical="true"
             android:layout_toLeftOf="@+id/br_play"
             android:layout_marginRight="@dimen/d18"
+            android:clickable="true"
             android:background="@drawable/shape_other_item_bg"
             android:orientation="horizontal"
             >
@@ -116,8 +124,9 @@
             android:layout_height="@dimen/d45"
             android:gravity="center_vertical"
             android:layout_centerVertical="true"
-            android:layout_toLeftOf="@+id/br_settings"
+            android:layout_toLeftOf="@+id/br_stop"
             android:layout_marginRight="@dimen/d18"
+            android:clickable="true"
             android:background="@drawable/shape_other_item_bg"
             android:orientation="horizontal"
             >
@@ -141,6 +150,35 @@
         </LinearLayout>
 
         <LinearLayout
+            android:id="@+id/br_stop"
+            android:layout_width="@dimen/d100"
+            android:layout_height="@dimen/d45"
+            android:gravity="center_vertical"
+            android:layout_centerVertical="true"
+            android:layout_toLeftOf="@+id/br_settings"
+            android:clickable="true"
+            android:background="@drawable/shape_other_item_bg"
+            android:orientation="horizontal"
+            >
+
+            <ImageView
+                android:layout_width="@dimen/d32"
+                android:layout_height="@dimen/d32"
+                android:background="@mipmap/stop_br"
+                android:layout_marginLeft="@dimen/d10"
+                />
+
+            <TextView
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:layout_marginLeft="@dimen/d5"
+                android:text="停止"
+                android:textColor="@color/black"
+                android:textSize="@dimen/font_size_18"
+                android:textStyle="bold" />
+        </LinearLayout>
+
+        <LinearLayout
             android:id="@+id/br_settings"
             android:layout_width="@dimen/d100"
             android:layout_height="@dimen/d45"
@@ -148,6 +186,7 @@
             android:layout_centerVertical="true"
             android:layout_alignParentRight="true"
             android:layout_marginRight="@dimen/d18"
+            android:clickable="true"
             android:background="@drawable/shape_other_item_bg"
             android:orientation="horizontal"
             >

+ 25 - 0
android_host/src/main/res/layout/br_main_item_lay.xml

@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="utf-8"?>
+<layout>
+<LinearLayout
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="wrap_content"
+    android:layout_height="wrap_content"
+    android:orientation="vertical"
+    android:gravity="center_vertical"
+    android:layout_marginLeft="@dimen/d25"
+
+    >
+
+    <TextView
+        android:id="@+id/br_main_item_name"
+        android:layout_width="@dimen/d80"
+        android:layout_height="@dimen/d40"
+        android:text="王医生"
+        android:background="@drawable/shape_time_f_bg"
+        android:layout_marginBottom="@dimen/d10"
+        android:textSize="16sp"
+        android:gravity="center"
+        android:textColor="@color/black"/>
+</LinearLayout>
+    
+</layout>

+ 163 - 0
android_host/src/main/res/layout/fragment_br_call.xml

@@ -0,0 +1,163 @@
+<?xml version="1.0" encoding="utf-8"?>
+<layout xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:bind="http://schemas.android.com/apk/res-auto">
+    <LinearLayout
+        android:layout_width="match_parent"
+        android:layout_height="match_parent"
+        android:background="#EAF2F9"
+        android:orientation="vertical"
+        android:gravity="center_horizontal"
+        >
+
+        <LinearLayout
+            android:layout_width="match_parent"
+            android:layout_height="match_parent"
+            android:background="@drawable/shape_bed_bg"
+            android:layout_marginTop="@dimen/d16"
+            android:layout_marginRight="@dimen/d24"
+            android:layout_marginLeft="@dimen/d15"
+            android:orientation="vertical"
+            >
+            <LinearLayout
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:layout_marginTop="@dimen/d15"
+                android:visibility="gone"
+                >
+                <TextView
+                    android:layout_width="wrap_content"
+                    android:layout_height="wrap_content"
+                    android:text="*"
+                    android:textSize="@dimen/font_size_18"
+                    android:textColor="@color/txt_number"
+                    android:textStyle="bold"
+                    android:layout_marginLeft="@dimen/d28"
+                    />
+                <TextView
+                    android:layout_width="wrap_content"
+                    android:layout_height="wrap_content"
+                    android:layout_toRightOf="@+id/set_br_tx_3"
+                    android:text="请选择播放区域(多选)"
+                    android:textSize="@dimen/font_size_18"
+                    android:textColor="@color/black"
+                    android:textStyle="bold"
+                    />
+            </LinearLayout>
+            <LinearLayout
+                android:layout_width="match_parent"
+                android:layout_height="50dp"
+                android:visibility="gone"
+                >
+                <androidx.recyclerview.widget.RecyclerView
+                    android:id="@+id/call_bt_rv"
+                    android:layout_width="match_parent"
+                    android:layout_height="match_parent"
+                    android:layout_marginLeft="28dp"
+                    android:layout_marginTop="@dimen/d5"
+                    android:overScrollMode="never"
+                    android:paddingRight="@dimen/d10" />
+
+            </LinearLayout>
+
+            <LinearLayout
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:layout_marginTop="@dimen/d15"
+
+                >
+                <TextView
+                    android:layout_width="wrap_content"
+                    android:layout_height="wrap_content"
+                    android:text="*"
+                    android:textSize="@dimen/font_size_18"
+                    android:textColor="@color/txt_number"
+                    android:textStyle="bold"
+                    android:layout_marginLeft="@dimen/d28"
+                    />
+
+                <TextView
+                    android:layout_width="wrap_content"
+                    android:layout_height="wrap_content"
+                    android:layout_toRightOf="@+id/set_br_tx_3"
+                    android:text="点击按钮进行喊话广播"
+                    android:textSize="@dimen/font_size_18"
+                    android:textColor="@color/black"
+                    android:textStyle="bold"
+
+                    />
+            </LinearLayout>
+
+            <TextView
+                android:id="@+id/tv_broadcast_title"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:layout_gravity="center"
+                android:layout_marginTop="5dp"
+                android:textColor="@color/color_red"
+                android:textSize="25sp"
+                android:textStyle="bold" />
+
+            <com.wdkl.ncs.android.lib.widget.VoiceLoadingView
+                android:id="@+id/my_voice_load_view"
+                android:layout_width="180dp"
+                android:layout_height="50dp"
+                android:layout_marginTop="10dp"
+                android:layout_gravity="center"
+                bind:cmlv_line_width="4dp"
+                bind:cmlv_rail_color="#0090ff"
+                bind:cmlv_rail_count="10" />
+
+            <ImageView
+                android:id="@+id/btn_record"
+                android:layout_width="100dp"
+                android:layout_height="80dp"
+                android:layout_gravity="center"
+                android:layout_marginTop="@dimen/d8"
+                android:scaleType="center"
+                android:background="@drawable/mic_on"
+               />
+
+            <TextView
+                android:id="@+id/tv_record"
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:layout_marginTop="10dp"
+                android:gravity="center"
+                android:text="@string/broadcast_record_start"
+                android:textSize="24sp" />
+
+
+            <TextView
+                android:id="@+id/call_bt_call"
+                android:layout_width="@dimen/d420"
+                android:layout_height="@dimen/d60"
+                android:layout_alignParentBottom="true"
+                android:layout_centerHorizontal="true"
+                android:layout_gravity="center"
+                android:layout_marginTop="@dimen/d16"
+                android:background="@drawable/shape_main_hos_txt_bg"
+                android:gravity="center"
+                android:text="开始喊话"
+                android:textColor="@color/white"
+                android:textSize="@dimen/font_size_20" />
+
+            <TextView
+                android:id="@+id/call_bt_bt"
+                android:layout_width="@dimen/d420"
+                android:layout_height="@dimen/d60"
+                android:layout_gravity="center"
+                android:gravity="center"
+                android:text="挂断"
+                android:visibility="gone"
+                android:textColor="@color/white"
+                android:background="@drawable/shape_main_call_r_wj_bg"
+                android:layout_marginTop="@dimen/d16"
+                android:layout_alignParentBottom="true"
+                android:layout_centerHorizontal="true"
+                android:textSize="@dimen/font_size_20" />
+
+        </LinearLayout>
+
+
+    </LinearLayout>
+</layout>

+ 17 - 17
android_host/src/main/res/layout/fragment_br_main.xml

@@ -8,26 +8,26 @@
         android:background="#EAF2F9"
         android:orientation="horizontal">
 
-        <com.scwang.smartrefresh.layout.SmartRefreshLayout
-            android:id="@+id/refresh"
-            android:layout_width="0px"
-            android:layout_height="match_parent"
-            android:layout_marginLeft="8dp"
-            android:layout_marginRight="8dp"
-            android:layout_weight="0.74"
-            bind:srlEnableLoadMore="false"
-            bind:srlEnableRefresh="true">
+<!--        <com.scwang.smartrefresh.layout.SmartRefreshLayout-->
+<!--            android:id="@+id/refresh"-->
+<!--            android:layout_width="0px"-->
+<!--            android:layout_height="match_parent"-->
+<!--            android:layout_weight="0.74"-->
+<!--            bind:srlEnableLoadMore="false"-->
+<!--            bind:srlEnableRefresh="true">-->
 
-            <androidx.recyclerview.widget.RecyclerView
-                android:id="@+id/listView"
-                android:layout_width="match_parent"
-                android:layout_height="match_parent"
-                android:scrollbars="vertical"
-                android:fadeScrollbars="true"
-                android:scrollbarStyle="insideOverlay" />
+<!--           -->
 
-        </com.scwang.smartrefresh.layout.SmartRefreshLayout>
+<!--        </com.scwang.smartrefresh.layout.SmartRefreshLayout>-->
 
+        <androidx.recyclerview.widget.RecyclerView
+            android:id="@+id/br_listView"
+            android:layout_width="match_parent"
+            android:layout_height="match_parent"
+            android:scrollbars="vertical"
+            android:fadeScrollbars="true"
+            android:scrollbarStyle="insideOverlay"
+            />
 
     </LinearLayout>
 </layout>

+ 583 - 0
android_host/src/main/res/layout/fragment_br_set.xml

@@ -0,0 +1,583 @@
+<?xml version="1.0" encoding="utf-8"?>
+<layout xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:bind="http://schemas.android.com/apk/res-auto">
+    <LinearLayout
+        android:layout_width="match_parent"
+        android:layout_height="match_parent"
+        android:background="#EAF2F9"
+        android:orientation="vertical"
+        android:gravity="center_horizontal"
+        >
+        <RelativeLayout
+            android:layout_width="match_parent"
+            android:layout_height="@dimen/d144"
+            android:background="@drawable/shape_bed_bg"
+            android:layout_marginTop="@dimen/d20"
+            android:layout_marginLeft="@dimen/d15"
+            android:layout_marginRight="@dimen/d24"
+            android:orientation="vertical"
+            >
+
+
+            <TextView
+                android:id="@+id/set_br_tx_1"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:text="*"
+                android:textSize="@dimen/font_size_18"
+                android:textColor="@color/txt_number"
+                android:textStyle="bold"
+                android:layout_marginTop="@dimen/d24"
+                android:layout_marginLeft="@dimen/d28"
+                />
+
+            <TextView
+                android:id="@+id/set_br_tx_2"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:layout_toRightOf="@+id/set_br_tx_1"
+                android:text="请设置录音名称"
+                android:textSize="@dimen/font_size_18"
+                android:textColor="@color/black"
+                android:textStyle="bold"
+                android:layout_marginTop="@dimen/d24"
+
+                />
+
+            <EditText
+                android:id="@+id/set_br_ed_name"
+                android:layout_width="match_parent"
+                android:layout_height="@dimen/d50"
+                android:hint="请输入广播标题"
+                android:paddingLeft="@dimen/d26"
+                android:textSize="@dimen/font_size_18"
+                android:gravity="center_vertical"
+                android:layout_below="@+id/set_br_tx_2"
+                android:textStyle="bold"
+                android:background="@drawable/shape_n_login_ed_bg2"
+                android:layout_marginTop="@dimen/d16"
+                android:layout_marginLeft="@dimen/d28"
+                android:layout_marginRight="@dimen/d48"
+                />
+
+
+        </RelativeLayout>
+
+
+        <LinearLayout
+            android:layout_width="match_parent"
+            android:layout_height="match_parent"
+            android:background="@drawable/shape_bed_bg"
+            android:layout_marginTop="@dimen/d16"
+            android:layout_marginRight="@dimen/d24"
+            android:layout_marginLeft="@dimen/d15"
+            android:orientation="vertical"
+            >
+
+            <LinearLayout
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:orientation="horizontal"
+                android:layout_marginTop="@dimen/d15"
+                >
+
+
+                <LinearLayout
+                    android:layout_width="0dp"
+                    android:layout_height="@dimen/d45"
+                    android:layout_weight="1"
+                    android:orientation="horizontal">
+                    <TextView
+                        android:layout_width="wrap_content"
+                        android:layout_height="wrap_content"
+                        android:text="*"
+                        android:textSize="@dimen/font_size_18"
+                        android:textColor="@color/txt_number"
+                        android:textStyle="bold"
+                        android:layout_marginLeft="@dimen/d28"
+                        android:layout_gravity="center_vertical"
+                        />
+
+                    <TextView
+                        android:layout_width="wrap_content"
+                        android:layout_height="wrap_content"
+                        android:layout_toRightOf="@+id/set_br_tx_3"
+                        android:text="广播模式"
+                        android:textSize="@dimen/font_size_18"
+                        android:textColor="@color/black"
+                        android:textStyle="bold"
+                        android:layout_gravity="center_vertical"
+                        />
+
+                    <RadioGroup
+                        android:id="@+id/group_br_type_ll"
+                        android:layout_width="wrap_content"
+                        android:layout_height="match_parent"
+                        android:layout_marginLeft="@dimen/d22"
+                        android:orientation="horizontal">
+
+                        <RadioButton
+                            android:id="@+id/radio_sd"
+                            android:layout_width="wrap_content"
+                            android:layout_height="wrap_content"
+                            android:text="手动模式"
+                            android:layout_toRightOf="@+id/set_br_tx_4"
+                            android:layout_gravity="center_vertical"
+                            android:textColor="@drawable/radio_button_selector_txt2"
+                            android:button="@null"
+                            android:drawableLeft="@drawable/radio_button_selector_bg2"
+                            android:drawablePadding="@dimen/d5"
+                            android:textSize="14px" />
+
+                        <RadioButton
+                            android:id="@+id/radio_zd"
+                            android:layout_width="wrap_content"
+                            android:layout_height="wrap_content"
+                            android:layout_gravity="center_vertical"
+                            android:layout_marginLeft="@dimen/d22"
+                            android:text="自动模式"
+                            android:textColor="@drawable/radio_button_selector_txt2"
+                            android:button="@null"
+                            android:drawableLeft="@drawable/radio_button_selector_bg2"
+                            android:drawablePadding="@dimen/d5"
+                            android:textSize="14px" />
+
+                    </RadioGroup>
+
+                </LinearLayout>
+
+                <LinearLayout
+                    android:layout_width="0dp"
+                    android:layout_height="@dimen/d45"
+                    android:layout_weight="1"
+                    android:layout_gravity="center_vertical"
+                    android:orientation="horizontal">
+
+                    <TextView
+                        android:layout_width="wrap_content"
+                        android:layout_height="wrap_content"
+                        android:text="*"
+                        android:textSize="@dimen/font_size_18"
+                        android:textColor="@color/txt_number"
+                        android:textStyle="bold"
+                        android:layout_gravity="center_vertical"
+                        android:layout_marginLeft="@dimen/d28"
+                        />
+
+                    <TextView
+                        android:layout_width="wrap_content"
+                        android:layout_height="wrap_content"
+                        android:text="播放模式"
+                        android:textSize="@dimen/font_size_18"
+                        android:textColor="@color/black"
+                        android:textStyle="bold"
+                        android:layout_gravity="center_vertical"
+                        />
+
+                    <RadioGroup
+                        android:id="@+id/group_br_play_type_ll"
+                        android:layout_width="wrap_content"
+                        android:layout_height="match_parent"
+                        android:layout_marginLeft="@dimen/d22"
+                        android:orientation="horizontal">
+                        <RadioButton
+                            android:id="@+id/radio_ds"
+                            android:layout_width="wrap_content"
+                            android:layout_height="wrap_content"
+                            android:text="定时模式"
+                            android:layout_toRightOf="@+id/set_br_tx_4"
+                            android:layout_gravity="center_vertical"
+                            android:textColor="@drawable/radio_button_selector_txt2"
+                            android:button="@null"
+                            android:drawableLeft="@drawable/radio_button_selector_bg2"
+                            android:drawablePadding="@dimen/d5"
+                            android:textSize="14px" />
+
+                        <RadioButton
+                            android:id="@+id/radio_dc"
+                            android:layout_width="wrap_content"
+                            android:layout_height="wrap_content"
+                            android:layout_gravity="center_vertical"
+                            android:layout_marginLeft="@dimen/d22"
+                            android:text="定次模式"
+                            android:textColor="@drawable/radio_button_selector_txt2"
+                            android:button="@null"
+                            android:drawableLeft="@drawable/radio_button_selector_bg2"
+                            android:drawablePadding="@dimen/d5"
+                            android:textSize="14px" />
+                    </RadioGroup>
+
+
+                </LinearLayout>
+
+
+            </LinearLayout>
+
+
+
+            <LinearLayout
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                >
+                <LinearLayout
+                    android:layout_width="0dp"
+                    android:layout_height="@dimen/d48"
+                    android:layout_weight="1"
+                    android:orientation="horizontal">
+
+                    <TextView
+                        android:layout_width="wrap_content"
+                        android:layout_height="wrap_content"
+                        android:text="*"
+                        android:textSize="@dimen/font_size_18"
+                        android:textColor="@color/txt_number"
+                        android:textStyle="bold"
+                        android:layout_gravity="center_vertical"
+                        android:layout_marginLeft="@dimen/d28"
+                        />
+
+                    <TextView
+                        android:layout_width="wrap_content"
+                        android:layout_height="wrap_content"
+                        android:text="是否启用"
+                        android:textSize="@dimen/font_size_18"
+                        android:textColor="@color/black"
+                        android:textStyle="bold"
+                        android:layout_gravity="center_vertical"
+                        />
+                    <RadioButton
+                        android:id="@+id/radio_qy"
+                        android:layout_width="wrap_content"
+                        android:layout_height="wrap_content"
+                        android:layout_marginLeft="@dimen/d22"
+                        android:text="开启此广播"
+                        android:layout_gravity="center_vertical"
+
+                        android:textColor="@drawable/radio_button_selector_txt2"
+                        android:button="@null"
+                        android:drawableLeft="@drawable/radio_button_selector_bg2"
+                        android:drawablePadding="@dimen/d5"
+                        android:textSize="14px" />
+
+
+
+                </LinearLayout>
+
+                <LinearLayout
+                    android:layout_width="0dp"
+                    android:layout_height="@dimen/d48"
+                    android:layout_weight="1"
+                    android:orientation="horizontal">
+
+
+
+                  <TextView
+                        android:layout_width="wrap_content"
+                        android:layout_height="wrap_content"
+                        android:text="*"
+                        android:textSize="@dimen/font_size_18"
+                        android:textColor="@color/txt_number"
+                        android:textStyle="bold"
+                        android:layout_gravity="center_vertical"
+                        android:layout_marginLeft="@dimen/d28"
+                        />
+
+                    <TextView
+                        android:layout_width="wrap_content"
+                        android:layout_height="wrap_content"
+                        android:layout_toRightOf="@+id/set_br_tx_3"
+                        android:text="定次播放次数"
+                        android:textSize="@dimen/font_size_18"
+                        android:textColor="@color/black"
+                        android:textStyle="bold"
+                        android:layout_gravity="center_vertical"
+                        />
+
+                    <EditText
+                        android:id="@+id/set_br_number_ed"
+                        android:layout_width="wrap_content"
+                        android:layout_height="wrap_content"
+                        android:layout_gravity="center_vertical"
+                        android:gravity="center"
+                        android:hint="请输入播报次数"
+                        android:layout_marginLeft="@dimen/d22"
+                        android:inputType="number"
+                        android:text=""
+                        android:textColor="#000000"
+                        android:textSize="14px" />
+
+
+
+                </LinearLayout>
+
+
+
+            </LinearLayout>
+
+
+            <LinearLayout
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+
+                >
+                    <TextView
+                        android:layout_width="wrap_content"
+                        android:layout_height="wrap_content"
+                        android:text="*"
+                        android:textSize="@dimen/font_size_18"
+                        android:textColor="@color/txt_number"
+                        android:textStyle="bold"
+                        android:layout_marginLeft="@dimen/d28"
+                        />
+
+                    <TextView
+                        android:layout_width="wrap_content"
+                        android:layout_height="wrap_content"
+                        android:layout_toRightOf="@+id/set_br_tx_3"
+                        android:text="请选择播放时间(多选)"
+                        android:textSize="@dimen/font_size_18"
+                        android:textColor="@color/black"
+                        android:textStyle="bold"
+
+                        />
+            </LinearLayout>
+
+            <LinearLayout
+                android:layout_width="match_parent"
+                android:layout_height="@dimen/d40"
+                android:orientation="horizontal"
+                android:gravity="center_vertical"
+                android:layout_marginTop="@dimen/d10"
+                >
+                    <TextView
+                        android:id="@+id/set_br_tx_3"
+                        android:layout_width="@dimen/d60"
+                        android:layout_height="@dimen/d30"
+                        android:layout_below="@+id/nurse_msg_tx_11"
+                        android:gravity="center"
+                        android:text="周一"
+                        android:textSize="@dimen/font_size_14"
+                        android:textColor="@color/text_name_color"
+                        android:layout_marginLeft="@dimen/d28"
+                        android:background="@drawable/shape_time_f_bg"
+                        />
+                    <TextView
+                        android:id="@+id/set_br_tx_4"
+                        android:layout_width="@dimen/d60"
+                        android:layout_height="@dimen/d30"
+                        android:layout_below="@+id/nurse_msg_tx_11"
+                        android:gravity="center"
+                        android:text="周二"
+                        android:textSize="@dimen/font_size_16"
+                        android:textColor="@color/text_name_color"
+                        android:layout_marginLeft="@dimen/d5"
+                        android:background="@drawable/shape_time_f_bg"
+                        />
+                    <TextView
+                        android:id="@+id/set_br_tx_5"
+                        android:layout_width="@dimen/d60"
+                        android:layout_height="@dimen/d30"
+                        android:layout_below="@+id/nurse_msg_tx_11"
+                        android:gravity="center"
+                        android:text="周三"
+                        android:textSize="@dimen/font_size_16"
+                        android:textColor="@color/text_name_color"
+                        android:layout_marginLeft="@dimen/d5"
+                        android:background="@drawable/shape_time_f_bg"
+                        />
+                    <TextView
+                        android:id="@+id/set_br_tx_6"
+                        android:layout_width="@dimen/d60"
+                        android:layout_height="@dimen/d30"
+                        android:layout_below="@+id/nurse_msg_tx_11"
+                        android:gravity="center"
+                        android:text="周四"
+                        android:textSize="@dimen/font_size_16"
+                        android:textColor="@color/text_name_color"
+                        android:layout_marginLeft="@dimen/d5"
+                        android:background="@drawable/shape_time_f_bg"
+                        />
+                    <TextView
+                        android:id="@+id/set_br_tx_7"
+                        android:layout_width="@dimen/d60"
+                        android:layout_height="@dimen/d30"
+                        android:layout_below="@+id/nurse_msg_tx_11"
+                        android:gravity="center"
+                        android:text="周五"
+                        android:textSize="@dimen/font_size_16"
+                        android:textColor="@color/text_name_color"
+                        android:layout_marginLeft="@dimen/d5"
+                        android:background="@drawable/shape_time_f_bg"
+                        />
+                    <TextView
+                        android:id="@+id/set_br_tx_8"
+                        android:layout_width="@dimen/d60"
+                        android:layout_height="@dimen/d30"
+                        android:layout_below="@+id/nurse_msg_tx_11"
+                        android:gravity="center"
+                        android:text="周六"
+                        android:textSize="@dimen/font_size_16"
+                        android:textColor="@color/text_name_color"
+                        android:layout_marginLeft="@dimen/d5"
+                        android:background="@drawable/shape_time_f_bg"
+                        />
+
+                    <TextView
+                        android:id="@+id/set_br_tx_9"
+                        android:layout_width="@dimen/d60"
+                        android:layout_height="@dimen/d30"
+                        android:layout_below="@+id/nurse_msg_tx_11"
+                        android:gravity="center"
+                        android:text="周日"
+                        android:textSize="@dimen/font_size_16"
+                        android:textColor="@color/text_name_color"
+                        android:layout_marginLeft="@dimen/d5"
+                        android:background="@drawable/shape_time_f_bg"
+                        />
+
+
+
+                <RelativeLayout
+                    android:id="@+id/set_br_time_out_ll"
+                    android:layout_width="@dimen/d65"
+                    android:layout_height="@dimen/d30"
+                    android:layout_marginLeft="@dimen/d22"
+                    android:clickable="true"
+                    android:background="@drawable/shape_n_login_ed_bg2"
+                    >
+                    <TextView
+                        android:id="@+id/set_br_time_out"
+                        android:layout_width="wrap_content"
+                        android:layout_height="wrap_content"
+                        android:layout_centerVertical="true"
+                        android:text="00:00"
+                        android:textSize="@dimen/font_size_12"
+                        android:textColor="@color/txt_number"
+                        android:textStyle="bold"
+                        android:layout_marginLeft="@dimen/d13"
+                        />
+                    <ImageView
+                        android:id="@+id/set_br_time_out_img"
+                        android:layout_width="@dimen/d10"
+                        android:layout_height="@dimen/d10"
+                        android:layout_marginTop="@dimen/d10"
+                        android:layout_marginLeft="@dimen/d5"
+                        android:src="@mipmap/xia"
+                        android:layout_toRightOf="@+id/set_br_time_out"
+                        />
+
+                </RelativeLayout>
+
+                <RelativeLayout
+                    android:id="@+id/set_br_time_end_ll"
+                    android:layout_width="@dimen/d65"
+                    android:layout_height="@dimen/d30"
+                    android:layout_marginLeft="@dimen/d12"
+                    android:clickable="true"
+                    android:background="@drawable/shape_n_login_ed_bg2"
+                    >
+
+                    <TextView
+                        android:id="@+id/set_br_time_end"
+                        android:layout_width="wrap_content"
+                        android:layout_height="wrap_content"
+                        android:layout_centerVertical="true"
+                        android:layout_marginLeft="@dimen/d13"
+                        android:text="00:00"
+                        android:textColor="@color/txt_number"
+                        android:textSize="@dimen/font_size_12"
+                        android:textStyle="bold" />
+                    <ImageView
+                        android:id="@+id/set_br_time_end_img"
+                        android:layout_width="@dimen/d10"
+                        android:layout_height="@dimen/d10"
+                        android:layout_marginTop="@dimen/d10"
+                        android:layout_marginLeft="@dimen/d5"
+                        android:src="@mipmap/xia"
+                        android:layout_toRightOf="@+id/set_br_time_end"
+                        />
+
+                </RelativeLayout>
+
+
+            </LinearLayout>
+
+
+            <LinearLayout
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:layout_marginTop="@dimen/d10"
+                >
+                <TextView
+                    android:layout_width="wrap_content"
+                    android:layout_height="wrap_content"
+                    android:text="*"
+                    android:textSize="@dimen/font_size_18"
+                    android:textColor="@color/txt_number"
+                    android:textStyle="bold"
+                    android:layout_marginLeft="@dimen/d28"
+                    />
+                <TextView
+                    android:layout_width="wrap_content"
+                    android:layout_height="wrap_content"
+                    android:layout_toRightOf="@+id/set_br_tx_3"
+                    android:text="请选择播放区域(多选)"
+                    android:textSize="@dimen/font_size_18"
+                    android:textColor="@color/black"
+                    android:textStyle="bold"
+                    />
+            </LinearLayout>
+
+            <LinearLayout
+                android:layout_width="match_parent"
+                android:layout_height="@dimen/d60"
+                android:layout_marginTop="@dimen/d10"
+                >
+                <androidx.recyclerview.widget.RecyclerView
+                    android:id="@+id/info_f_ar"
+                    android:layout_width="match_parent"
+                    android:layout_height="match_parent"
+                    android:layout_marginLeft="28dp"
+                    android:layout_marginTop="@dimen/d5"
+                    android:overScrollMode="never"
+                    android:paddingRight="@dimen/d10" />
+
+            </LinearLayout>
+
+            <LinearLayout
+                android:layout_width="match_parent"
+                android:layout_height="match_parent"
+                android:gravity="center"
+                >
+
+                <TextView
+                    android:id="@+id/br_retun_bt"
+                    android:layout_width="@dimen/d350"
+                    android:layout_height="@dimen/d60"
+                    android:layout_marginRight="@dimen/d22"
+                    android:layout_gravity="center"
+                    android:background="@drawable/shape_password_bt_bg"
+                    android:gravity="center"
+                    android:text="返回界面"
+                    android:textColor="@color/white"
+                    android:textSize="@dimen/font_size_20" />
+
+                <TextView
+                    android:id="@+id/br_save_bt"
+                    android:layout_width="@dimen/d350"
+                    android:layout_height="@dimen/d60"
+                    android:layout_gravity="center"
+                    android:background="@drawable/shape_main_hos_txt_bg"
+                    android:gravity="center"
+                    android:text="保存设置"
+                    android:textColor="@color/white"
+                    android:textSize="@dimen/font_size_20" />
+
+            </LinearLayout>
+
+
+        </LinearLayout>
+
+
+    </LinearLayout>
+</layout>

+ 2 - 1
android_host/src/main/res/layout/fragment_broadcast.xml

@@ -15,7 +15,8 @@
         <RelativeLayout
             android:id="@+id/broadcast_relayout"
             android:layout_width="wrap_content"
-            android:layout_height="wrap_content">
+            android:layout_height="wrap_content"
+            >
 
             <LinearLayout
                 android:id="@+id/broadcast_linlyout"

+ 127 - 420
android_host/src/main/res/layout/fragment_broadcast_host.xml

@@ -1,428 +1,135 @@
 <?xml version="1.0" encoding="utf-8"?>
-<layout xmlns:bind="http://schemas.android.com/apk/res-auto">
-    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+<layout xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:bind="http://schemas.android.com/apk/res-auto">
+    <LinearLayout
         android:layout_width="match_parent"
         android:layout_height="match_parent"
         android:orientation="vertical"
+        android:background="#EAF2F9"
         >
-<!--        <LinearLayout-->
-<!--            android:layout_width="match_parent"-->
-<!--            android:layout_height="wrap_content"-->
-<!--            android:visibility="gone"-->
-<!--            >-->
-
-<!--            <LinearLayout-->
-<!--                android:id="@+id/ll_gb_bt"-->
-<!--                android:layout_width="0dp"-->
-<!--                android:layout_height="90dp"-->
-<!--                android:layout_weight="1"-->
-<!--                android:clickable="true"-->
-<!--                android:orientation="horizontal"-->
-<!--                android:gravity="center_vertical"-->
-<!--                android:layout_below="@+id/tv_nursing_code">-->
-
-<!--                <ImageView-->
-<!--                    android:layout_width="@dimen/d80"-->
-<!--                    android:layout_height="@dimen/d80"-->
-<!--                    android:layout_marginLeft="@dimen/d34"-->
-<!--                    android:src="@mipmap/yin"/>-->
-
-<!--                <TextView-->
-<!--                    android:layout_width="wrap_content"-->
-<!--                    android:layout_height="wrap_content"-->
-<!--                    android:textColor="@color/black"-->
-<!--                    android:textStyle="bold"-->
-<!--                    android:layout_marginLeft="@dimen/d21"-->
-<!--                    android:text="广播列表"-->
-<!--                    android:textSize="18sp" />-->
-
-<!--                <ImageView-->
-<!--                    android:layout_width="wrap_content"-->
-<!--                    android:layout_height="wrap_content"-->
-<!--                    android:layout_marginLeft="@dimen/d24"-->
-<!--                    android:background="@mipmap/jr"-->
-<!--                    />-->
-<!--            </LinearLayout>-->
-<!--            <LinearLayout-->
-<!--                android:id="@+id/ll_tj_bt"-->
-<!--                android:layout_width="0dp"-->
-<!--                android:layout_height="90dp"-->
-<!--                android:layout_weight="1"-->
-<!--                android:clickable="true"-->
-<!--                android:layout_marginLeft="@dimen/d15"-->
-<!--                android:layout_marginRight="@dimen/d15"-->
-<!--                android:orientation="horizontal"-->
-<!--                android:gravity="center_vertical"-->
-<!--                android:layout_below="@+id/tv_nursing_code">-->
-
-<!--                <ImageView-->
-<!--                    android:layout_width="@dimen/d80"-->
-<!--                    android:layout_height="@dimen/d80"-->
-<!--                    android:layout_marginLeft="@dimen/d34"-->
-<!--                    android:src="@mipmap/add"/>-->
-
-<!--                <TextView-->
-<!--                    android:layout_width="wrap_content"-->
-<!--                    android:layout_height="wrap_content"-->
-<!--                    android:textColor="@color/black"-->
-<!--                    android:textStyle="bold"-->
-<!--                    android:layout_marginLeft="@dimen/d21"-->
-<!--                    android:text="添加录音"-->
-<!--                    android:textSize="18sp" />-->
-
-<!--                <ImageView-->
-<!--                    android:layout_width="wrap_content"-->
-<!--                    android:layout_height="wrap_content"-->
-<!--                    android:layout_marginLeft="@dimen/d24"-->
-<!--                    android:background="@mipmap/jr"-->
-<!--                    />-->
-<!--            </LinearLayout>-->
-<!--            <LinearLayout-->
-<!--                android:id="@+id/ll_hh_bt"-->
-<!--                android:layout_width="0dp"-->
-<!--                android:layout_height="90dp"-->
-<!--                android:layout_weight="1"-->
-<!--                android:clickable="true"-->
-<!--                android:orientation="horizontal"-->
-<!--                android:gravity="center_vertical"-->
-<!--                android:layout_below="@+id/tv_nursing_code">-->
-
-<!--                <ImageView-->
-<!--                    android:layout_width="@dimen/d80"-->
-<!--                    android:layout_height="@dimen/d80"-->
-<!--                    android:layout_marginLeft="@dimen/d34"-->
-<!--                    android:src="@mipmap/guangbo"/>-->
-
-<!--                <TextView-->
-<!--                    android:layout_width="wrap_content"-->
-<!--                    android:layout_height="wrap_content"-->
-<!--                    android:textColor="@color/black"-->
-<!--                    android:textStyle="bold"-->
-<!--                    android:layout_marginLeft="@dimen/d21"-->
-<!--                    android:text="喊话广播"-->
-<!--                    android:textSize="18sp" />-->
-
-<!--                <ImageView-->
-<!--                    android:layout_width="wrap_content"-->
-<!--                    android:layout_height="wrap_content"-->
-<!--                    android:layout_marginLeft="@dimen/d24"-->
-<!--                    android:background="@mipmap/jr"-->
-<!--                    />-->
-<!--            </LinearLayout>-->
-<!--        </LinearLayout>-->
-
-<!--        <FrameLayout-->
-<!--            android:id="@+id/br_frame"-->
-<!--            android:layout_width="match_parent"-->
-<!--            android:layout_height="match_parent"-->
-<!--            android:layout_marginTop="@dimen/d10"-->
-<!--            android:visibility="gone"-->
-<!--            />-->
-<!--                <RelativeLayout-->
-<!--                    android:layout_width="match_parent"-->
-<!--                    android:layout_height="@dimen/d144"-->
-<!--                    android:background="@drawable/shape_bed_bg"-->
-<!--                    android:layout_marginTop="@dimen/d20"-->
-<!--                    android:layout_marginLeft="@dimen/d15"-->
-<!--                    android:layout_marginRight="@dimen/d24"-->
-<!--                    android:orientation="vertical"-->
-<!--                    >-->
-<!--                    <TextView-->
-<!--                        android:id="@+id/nurse_msg_tx_1"-->
-<!--                        android:layout_width="wrap_content"-->
-<!--                        android:layout_height="wrap_content"-->
-<!--                        android:text="*"-->
-<!--                        android:textSize="@dimen/font_size_18"-->
-<!--                        android:textColor="@color/txt_number"-->
-<!--                        android:textStyle="bold"-->
-<!--                        android:layout_marginTop="@dimen/d24"-->
-<!--                        android:layout_marginLeft="@dimen/d28"-->
-<!--                        />-->
-
-<!--                    <TextView-->
-<!--                        android:id="@+id/nurse_msg_tx_2"-->
-<!--                        android:layout_width="wrap_content"-->
-<!--                        android:layout_height="wrap_content"-->
-<!--                        android:layout_toRightOf="@+id/nurse_msg_tx_1"-->
-<!--                        android:text="自定义输入"-->
-<!--                        android:textSize="@dimen/font_size_18"-->
-<!--                        android:textColor="@color/black"-->
-<!--                        android:textStyle="bold"-->
-<!--                        android:layout_marginTop="@dimen/d24"-->
-
-<!--                        />-->
-
-<!--                    <EditText-->
-<!--                        android:id="@+id/nurse_msg_ed"-->
-<!--                        android:layout_width="match_parent"-->
-<!--                        android:layout_height="@dimen/d50"-->
-<!--                        android:hint="请保持安静不要吵闹"-->
-<!--                        android:paddingLeft="@dimen/d26"-->
-<!--                        android:textSize="@dimen/font_size_18"-->
-<!--                        android:gravity="center_vertical"-->
-<!--                        android:layout_below="@+id/nurse_msg_tx_1"-->
-<!--                        android:textStyle="bold"-->
-<!--                        android:background="@drawable/shape_n_login_ed_bg2"-->
-<!--                        android:layout_marginTop="@dimen/d16"-->
-<!--                        android:layout_marginLeft="@dimen/d28"-->
-<!--                        android:layout_marginRight="@dimen/d48"-->
-<!--                        />-->
-
-
-<!--                </RelativeLayout>-->
-
-<!--                <LinearLayout-->
-<!--                    android:layout_width="match_parent"-->
-<!--                    android:layout_height="wrap_content"-->
-<!--                    android:orientation="vertical"-->
-<!--                    android:gravity="center_vertical"-->
-
-<!--                    >-->
-<!--                    <RelativeLayout-->
-<!--                        android:layout_width="@dimen/d600"-->
-<!--                        android:layout_height="@dimen/d265"-->
-<!--                        android:background="@drawable/shape_bed_bg"-->
-<!--                        android:layout_marginTop="@dimen/d20"-->
-<!--                        android:layout_marginLeft="@dimen/d14"-->
-<!--                        android:orientation="vertical"-->
-
-<!--                        >-->
-<!--                        <TextView-->
-<!--                            android:id="@+id/nurse_msg_tx_3"-->
-<!--                            android:layout_width="wrap_content"-->
-<!--                            android:layout_height="wrap_content"-->
-<!--                            android:text="*"-->
-<!--                            android:textSize="@dimen/font_size_18"-->
-<!--                            android:textColor="@color/txt_number"-->
-<!--                            android:textStyle="bold"-->
-<!--                            android:layout_marginTop="@dimen/d24"-->
-<!--                            android:layout_marginLeft="@dimen/d28"-->
-<!--                            />-->
-
-<!--                        <TextView-->
-<!--                            android:id="@+id/nurse_msg_tx_4"-->
-<!--                            android:layout_width="wrap_content"-->
-<!--                            android:layout_height="wrap_content"-->
-<!--                            android:layout_toRightOf="@+id/nurse_msg_tx_3"-->
-<!--                            android:text="快捷提示语"-->
-<!--                            android:textSize="@dimen/font_size_18"-->
-<!--                            android:textColor="@color/black"-->
-<!--                            android:textStyle="bold"-->
-<!--                            android:layout_marginTop="@dimen/d24"-->
-<!--                            />-->
-
-<!--                        <TextView-->
-<!--                            android:id="@+id/nurse_msg_tx_5"-->
-<!--                            android:layout_width="@dimen/d270"-->
-<!--                            android:layout_height="@dimen/d48"-->
-<!--                            android:layout_below="@+id/nurse_msg_tx_3"-->
-<!--                            android:gravity="center"-->
-<!--                            android:text="保持安静"-->
-<!--                            android:textSize="@dimen/font_size_16"-->
-<!--                            android:textColor="@color/text_name_color"-->
-<!--                            android:layout_marginTop="@dimen/d20"-->
-<!--                            android:layout_marginLeft="@dimen/d28"-->
-<!--                            android:background="@drawable/selector_nuser_msg_tx_d"-->
-<!--                            />-->
-<!--                        <TextView-->
-<!--                            android:id="@+id/nurse_msg_tx_6"-->
-<!--                            android:layout_width="@dimen/d270"-->
-<!--                            android:layout_height="@dimen/d48"-->
-<!--                            android:layout_below="@+id/nurse_msg_tx_5"-->
-<!--                            android:gravity="center"-->
-<!--                            android:text="请勿大声喧哗"-->
-<!--                            android:textSize="@dimen/font_size_16"-->
-<!--                            android:textColor="@color/text_name_color"-->
-<!--                            android:layout_marginTop="@dimen/d16"-->
-<!--                            android:layout_marginLeft="@dimen/d28"-->
-<!--                            android:background="@drawable/selector_nuser_msg_tx_d"-->
-<!--                            />-->
-<!--                        <TextView-->
-<!--                            android:id="@+id/nurse_msg_tx_7"-->
-<!--                            android:layout_width="@dimen/d270"-->
-<!--                            android:layout_height="@dimen/d48"-->
-<!--                            android:layout_below="@+id/nurse_msg_tx_6"-->
-<!--                            android:gravity="center"-->
-<!--                            android:text="正在如厕请勿进入"-->
-<!--                            android:textSize="@dimen/font_size_16"-->
-<!--                            android:textColor="@color/text_name_color"-->
-<!--                            android:layout_marginTop="@dimen/d16"-->
-<!--                            android:layout_marginLeft="@dimen/d28"-->
-<!--                            android:background="@drawable/selector_nuser_msg_tx_d"-->
-<!--                            />-->
-<!--                        <TextView-->
-<!--                            android:id="@+id/nurse_msg_tx_8"-->
-<!--                            android:layout_width="@dimen/d270"-->
-<!--                            android:layout_height="@dimen/d48"-->
-<!--                            android:layout_below="@+id/nurse_msg_tx_3"-->
-<!--                            android:layout_toRightOf="@+id/nurse_msg_tx_5"-->
-<!--                            android:gravity="center"-->
-<!--                            android:text="正在护理请勿打扰"-->
-<!--                            android:textSize="@dimen/font_size_16"-->
-<!--                            android:textColor="@color/text_name_color"-->
-<!--                            android:layout_marginTop="@dimen/d20"-->
-<!--                            android:layout_marginLeft="@dimen/d10"-->
-<!--                            android:background="@drawable/selector_nuser_msg_tx_d"-->
-<!--                            />-->
-<!--                        <TextView-->
-<!--                            android:id="@+id/nurse_msg_tx_9"-->
-<!--                            android:layout_width="@dimen/d270"-->
-<!--                            android:layout_height="@dimen/d48"-->
-<!--                            android:layout_below="@+id/nurse_msg_tx_5"-->
-<!--                            android:layout_toRightOf="@+id/nurse_msg_tx_6"-->
-<!--                            android:gravity="center"-->
-<!--                            android:text="请勿探视"-->
-<!--                            android:textSize="@dimen/font_size_16"-->
-<!--                            android:textColor="@color/text_name_color"-->
-<!--                            android:layout_marginTop="@dimen/d16"-->
-<!--                            android:layout_marginLeft="@dimen/d10"-->
-<!--                            android:background="@drawable/selector_nuser_msg_tx_d"-->
-<!--                            />-->
-<!--                        <TextView-->
-<!--                            android:id="@+id/nurse_msg_tx_10"-->
-<!--                            android:layout_width="@dimen/d270"-->
-<!--                            android:layout_height="@dimen/d48"-->
-<!--                            android:layout_below="@+id/nurse_msg_tx_6"-->
-<!--                            android:layout_toRightOf="@+id/nurse_msg_tx_7"-->
-<!--                            android:gravity="center"-->
-<!--                            android:text="请不要过多人聚集"-->
-<!--                            android:textSize="@dimen/font_size_16"-->
-<!--                            android:textColor="@color/text_name_color"-->
-<!--                            android:layout_marginTop="@dimen/d16"-->
-<!--                            android:layout_marginLeft="@dimen/d10"-->
-<!--                            android:background="@drawable/selector_nuser_msg_tx_d"-->
-<!--                            />-->
-<!--                    </RelativeLayout>-->
-<!--                    <RelativeLayout-->
-<!--                        android:layout_width="@dimen/d365"-->
-<!--                        android:layout_height="@dimen/d265"-->
-<!--                        android:background="@drawable/shape_bed_bg"-->
-<!--                        android:layout_marginTop="@dimen/d20"-->
-<!--                        android:layout_marginRight="@dimen/d28"-->
-<!--                        android:layout_marginLeft="@dimen/d15"-->
-<!--                        android:orientation="vertical"-->
-<!--                        >-->
-<!--                        <TextView-->
-<!--                            android:id="@+id/nurse_msg_tx_11"-->
-<!--                            android:layout_width="wrap_content"-->
-<!--                            android:layout_height="wrap_content"-->
-<!--                            android:text="*"-->
-<!--                            android:textSize="@dimen/font_size_18"-->
-<!--                            android:textColor="@color/txt_number"-->
-<!--                            android:textStyle="bold"-->
-<!--                            android:layout_marginTop="@dimen/d24"-->
-<!--                            android:layout_marginLeft="@dimen/d28"-->
-<!--                            />-->
-
-<!--                        <TextView-->
-<!--                            android:id="@+id/nurse_msg_tx_12"-->
-<!--                            android:layout_width="wrap_content"-->
-<!--                            android:layout_height="wrap_content"-->
-<!--                            android:layout_toRightOf="@+id/nurse_msg_tx_11"-->
-<!--                            android:text="设置提示时间"-->
-<!--                            android:textSize="@dimen/font_size_18"-->
-<!--                            android:textColor="@color/black"-->
-<!--                            android:textStyle="bold"-->
-<!--                            android:layout_marginTop="@dimen/d24"-->
-<!--                            />-->
-
-<!--                        <TextView-->
-<!--                            android:id="@+id/nurse_msg_tx_13"-->
-<!--                            android:layout_width="@dimen/d150"-->
-<!--                            android:layout_height="@dimen/d48"-->
-<!--                            android:layout_below="@+id/nurse_msg_tx_11"-->
-<!--                            android:gravity="center"-->
-<!--                            android:text="10分钟"-->
-<!--                            android:textSize="@dimen/font_size_16"-->
-<!--                            android:textColor="@color/text_name_color"-->
-<!--                            android:layout_marginTop="@dimen/d20"-->
-<!--                            android:layout_marginLeft="@dimen/d28"-->
-<!--                            android:background="@drawable/selector_nuser_msg_tx_d"-->
-<!--                            />-->
-<!--                        <TextView-->
-<!--                            android:id="@+id/nurse_msg_tx_14"-->
-<!--                            android:layout_width="@dimen/d150"-->
-<!--                            android:layout_height="@dimen/d48"-->
-<!--                            android:layout_below="@+id/nurse_msg_tx_13"-->
-<!--                            android:gravity="center"-->
-<!--                            android:text="30分钟"-->
-<!--                            android:textSize="@dimen/font_size_16"-->
-<!--                            android:textColor="@color/text_name_color"-->
-<!--                            android:layout_marginTop="@dimen/d16"-->
-<!--                            android:layout_marginLeft="@dimen/d28"-->
-<!--                            android:background="@drawable/selector_nuser_msg_tx_d"-->
-<!--                            />-->
-<!--                        <TextView-->
-<!--                            android:id="@+id/nurse_msg_tx_15"-->
-<!--                            android:layout_width="@dimen/d150"-->
-<!--                            android:layout_height="@dimen/d48"-->
-<!--                            android:layout_below="@+id/nurse_msg_tx_14"-->
-<!--                            android:gravity="center"-->
-<!--                            android:text="90分钟"-->
-<!--                            android:textSize="@dimen/font_size_16"-->
-<!--                            android:textColor="@color/text_name_color"-->
-<!--                            android:layout_marginTop="@dimen/d16"-->
-<!--                            android:layout_marginLeft="@dimen/d28"-->
-<!--                            android:background="@drawable/selector_nuser_msg_tx_d"-->
-<!--                            />-->
-<!--                        <TextView-->
-<!--                            android:id="@+id/nurse_msg_tx_16"-->
-<!--                            android:layout_width="@dimen/d150"-->
-<!--                            android:layout_height="@dimen/d48"-->
-<!--                            android:layout_below="@+id/nurse_msg_tx_11"-->
-<!--                            android:layout_toRightOf="@+id/nurse_msg_tx_13"-->
-<!--                            android:gravity="center"-->
-<!--                            android:text="15分钟"-->
-<!--                            android:textSize="@dimen/font_size_16"-->
-<!--                            android:textColor="@color/text_name_color"-->
-<!--                            android:layout_marginTop="@dimen/d20"-->
-<!--                            android:layout_marginLeft="@dimen/d10"-->
-<!--                            android:background="@drawable/selector_nuser_msg_tx_d"-->
-<!--                            />-->
-<!--                        <TextView-->
-<!--                            android:id="@+id/nurse_msg_tx_17"-->
-<!--                            android:layout_width="@dimen/d150"-->
-<!--                            android:layout_height="@dimen/d48"-->
-<!--                            android:layout_below="@+id/nurse_msg_tx_13"-->
-<!--                            android:layout_toRightOf="@+id/nurse_msg_tx_14"-->
-<!--                            android:gravity="center"-->
-<!--                            android:text="60分钟"-->
-<!--                            android:textSize="@dimen/font_size_16"-->
-<!--                            android:textColor="@color/text_name_color"-->
-<!--                            android:layout_marginTop="@dimen/d16"-->
-<!--                            android:layout_marginLeft="@dimen/d10"-->
-<!--                            android:background="@drawable/selector_nuser_msg_tx_d"-->
-<!--                            />-->
-<!--                        <TextView-->
-<!--                            android:id="@+id/nurse_msg_tx_18"-->
-<!--                            android:layout_width="@dimen/d150"-->
-<!--                            android:layout_height="@dimen/d48"-->
-<!--                            android:layout_below="@+id/nurse_msg_tx_14"-->
-<!--                            android:layout_toRightOf="@+id/nurse_msg_tx_15"-->
-<!--                            android:gravity="center"-->
-<!--                            android:text="120分钟"-->
-<!--                            android:textSize="@dimen/font_size_16"-->
-<!--                            android:textColor="@color/text_name_color"-->
-<!--                            android:layout_marginTop="@dimen/d16"-->
-<!--                            android:layout_marginLeft="@dimen/d10"-->
-<!--                            android:background="@drawable/selector_nuser_msg_tx_d"-->
-<!--                            />-->
-<!--                    </RelativeLayout>-->
-
-<!--                </LinearLayout>-->
-
-<!--                <TextView-->
-<!--                    android:id="@+id/nurse_msg_bt"-->
-<!--                    android:layout_width="@dimen/d420"-->
-<!--                    android:layout_height="@dimen/d60"-->
-<!--                    android:layout_gravity="center"-->
-<!--                    android:gravity="center"-->
-<!--                    android:text="开始提示"-->
-<!--                    android:textColor="@color/white"-->
-<!--                    android:background="@drawable/shape_main_hos_txt_bg"-->
-<!--                    android:layout_marginTop="@dimen/d26"-->
-<!--                    android:textSize="@dimen/font_size_20" />-->
-
+        <LinearLayout
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:layout_marginTop="@dimen/d20"
+            >
+
+            <LinearLayout
+                android:id="@+id/ll_gb_bt"
+                android:layout_width="0dp"
+                android:layout_height="90dp"
+                android:layout_weight="1"
+                android:clickable="true"
+                android:orientation="horizontal"
+                android:gravity="center_vertical"
+                android:background="@drawable/shape_bed_bg"
+                android:layout_below="@+id/tv_nursing_code"
+                android:layout_marginRight="@dimen/d15"
+                >
+
+                <ImageView
+                    android:layout_width="@dimen/d60"
+                    android:layout_height="@dimen/d60"
+                    android:layout_marginLeft="@dimen/d45"
+                    android:src="@mipmap/guangbo"/>
+
+                <TextView
+                    android:id="@+id/ll_gb_bt_tx"
+                    android:layout_width="wrap_content"
+                    android:layout_height="wrap_content"
+                    android:textColor="@color/black"
+                    android:textStyle="bold"
+                    android:layout_marginLeft="@dimen/d16"
+                    android:text="广播列表"
+                    android:textSize="18sp" />
+
+                <ImageView
+                    android:id="@+id/ll_gb_bt_img"
+                    android:layout_width="@dimen/d18"
+                    android:layout_height="@dimen/d18"
+                    android:layout_marginLeft="@dimen/d20"
+                    android:background="@mipmap/jr"
+                    />
+            </LinearLayout>
+
+            <LinearLayout
+                android:id="@+id/ll_hh_bt"
+                android:layout_width="0dp"
+                android:layout_height="90dp"
+                android:layout_weight="1"
+                android:clickable="true"
+                android:orientation="horizontal"
+                android:gravity="center_vertical"
+                android:background="@drawable/shape_bed_bg"
+                android:layout_below="@+id/tv_nursing_code">
+
+                <ImageView
+                    android:layout_width="@dimen/d60"
+                    android:layout_height="@dimen/d60"
+                    android:layout_marginLeft="@dimen/d44"
+                    android:src="@mipmap/yin"/>
+
+                <TextView
+                    android:id="@+id/ll_hh_bt_tx"
+                    android:layout_width="wrap_content"
+                    android:layout_height="wrap_content"
+                    android:textColor="@color/black"
+                    android:textStyle="bold"
+                    android:layout_marginLeft="@dimen/d16"
+                    android:text="喊话广播"
+                    android:textSize="18sp" />
+
+                <ImageView
+                    android:id="@+id/ll_hh_bt_img"
+                    android:layout_width="@dimen/d18"
+                    android:layout_height="@dimen/d18"
+                    android:layout_marginLeft="@dimen/d20"
+                    android:background="@mipmap/jr"
+                    />
+            </LinearLayout>
+
+            <LinearLayout
+                android:id="@+id/ll_tj_bt"
+                android:layout_width="0dp"
+                android:layout_height="90dp"
+                android:layout_weight="1"
+                android:clickable="true"
+                android:layout_marginLeft="@dimen/d15"
+                android:orientation="horizontal"
+                android:gravity="center_vertical"
+                android:background="@drawable/shape_bed_bg"
+                android:layout_below="@+id/tv_nursing_code">
+
+                <ImageView
+                    android:layout_width="@dimen/d60"
+                    android:layout_height="@dimen/d60"
+                    android:layout_marginLeft="@dimen/d44"
+                    android:src="@mipmap/add"/>
+
+                <TextView
+                    android:id="@+id/ll_tj_bt_tx"
+                    android:layout_width="wrap_content"
+                    android:layout_height="wrap_content"
+                    android:textColor="@color/black"
+                    android:textStyle="bold"
+                    android:layout_marginLeft="@dimen/d16"
+                    android:text="更多功能"
+                    android:textSize="18sp" />
+
+                <ImageView
+                    android:id="@+id/ll_tj_bt_img"
+                    android:layout_width="@dimen/d18"
+                    android:layout_height="@dimen/d18"
+                    android:layout_marginLeft="@dimen/d20"
+                    android:background="@mipmap/jr"
+                    />
+            </LinearLayout>
+        </LinearLayout>
+
+        <FrameLayout
+            android:id="@+id/br_frame"
+            android:layout_width="match_parent"
+            android:layout_height="match_parent"
+            android:layout_marginTop="@dimen/d10" />
 
     </LinearLayout>
 </layout>

+ 54 - 15
android_host/src/main/res/layout/fragment_system_settings.xml

@@ -721,8 +721,8 @@
                                     android:layout_marginRight="15px"
                                     android:layout_weight="1"
                                     android:maxHeight="2px"
-                                    android:progressDrawable="@drawable/po_seekbar"
-                                    android:thumb="@drawable/seekbar_thumb">
+                                    android:progressDrawable="@drawable/po_seekbar_h"
+                                    android:thumb="@drawable/seekbar_thumb_h">
 
                                 </SeekBar>
 
@@ -1251,7 +1251,12 @@
                                     android:layout_height="wrap_content"
                                     android:text="@string/setting_call_type_tts"
                                     android:textColor="@drawable/radio_button_selector_txt"
-                                    android:theme="@style/CustomRadioTheme"
+
+                                    android:button="@null"
+                                    android:drawableLeft="@drawable/radio_button_selector_bg"
+                                    android:drawablePadding="@dimen/d5"
+
+
                                     android:textSize="14px" />
 
                                 <RadioButton
@@ -1260,7 +1265,10 @@
                                     android:layout_height="wrap_content"
                                     android:text="@string/setting_call_type_ringtone"
                                     android:textColor="@drawable/radio_button_selector_txt"
-                                    android:theme="@style/CustomRadioTheme"
+                                    android:layout_marginLeft="@dimen/d10"
+                                    android:button="@null"
+                                    android:drawableLeft="@drawable/radio_button_selector_bg"
+                                    android:drawablePadding="@dimen/d5"
                                     android:textSize="14px" />
 
                                 <RadioButton
@@ -1269,7 +1277,10 @@
                                     android:layout_height="wrap_content"
                                     android:text="@string/setting_call_type_music"
                                     android:textColor="@drawable/radio_button_selector_txt"
-                                    android:theme="@style/CustomRadioTheme"
+                                    android:layout_marginLeft="@dimen/d10"
+                                    android:button="@null"
+                                    android:drawableLeft="@drawable/radio_button_selector_bg"
+                                    android:drawablePadding="@dimen/d5"
                                     android:textSize="14px" />
                             </RadioGroup>
 
@@ -1306,7 +1317,9 @@
                                     android:text="@string/setting_call_forwarding_enable"
                                     android:textSize="14px"
                                     android:textColor="@drawable/radio_button_selector_txt"
-                                    android:theme="@style/CustomRadioTheme"
+                                    android:button="@null"
+                                    android:drawableLeft="@drawable/radio_button_selector_bg"
+                                    android:drawablePadding="@dimen/d5"
                                     />
 
                                 <RadioButton
@@ -1315,7 +1328,10 @@
                                     android:layout_height="wrap_content"
                                     android:text="@string/setting_call_forwarding_disable"
                                     android:textColor="@drawable/radio_button_selector_txt"
-                                    android:theme="@style/CustomRadioTheme"
+                                    android:button="@null"
+                                    android:layout_marginLeft="@dimen/d10"
+                                    android:drawableLeft="@drawable/radio_button_selector_bg"
+                                    android:drawablePadding="@dimen/d5"
                                     android:textSize="14px" />
                             </RadioGroup>
 
@@ -1349,7 +1365,9 @@
                                     android:layout_height="wrap_content"
                                     android:text="@string/setting_call_forwarding_enable"
                                     android:textColor="@drawable/radio_button_selector_txt"
-                                    android:theme="@style/CustomRadioTheme"
+                                    android:button="@null"
+                                    android:drawableLeft="@drawable/radio_button_selector_bg"
+                                    android:drawablePadding="@dimen/d5"
                                     android:textSize="14px" />
 
                                 <RadioButton
@@ -1358,7 +1376,10 @@
                                     android:layout_height="wrap_content"
                                     android:text="@string/setting_call_forwarding_disable"
                                     android:textColor="@drawable/radio_button_selector_txt"
-                                    android:theme="@style/CustomRadioTheme"
+                                    android:layout_marginLeft="@dimen/d10"
+                                    android:button="@null"
+                                    android:drawableLeft="@drawable/radio_button_selector_bg"
+                                    android:drawablePadding="@dimen/d5"
                                     android:textSize="14px" />
                             </RadioGroup>
 
@@ -1392,7 +1413,10 @@
                                     android:layout_height="wrap_content"
                                     android:text="@string/setting_call_forwarding_enable"
                                     android:textColor="@drawable/radio_button_selector_txt"
-                                    android:theme="@style/CustomRadioTheme"
+
+                                    android:button="@null"
+                                    android:drawableLeft="@drawable/radio_button_selector_bg"
+                                    android:drawablePadding="@dimen/d5"
                                     android:textSize="14px" />
 
                                 <RadioButton
@@ -1401,7 +1425,10 @@
                                     android:layout_height="wrap_content"
                                     android:text="@string/setting_call_forwarding_disable"
                                     android:textColor="@drawable/radio_button_selector_txt"
-                                    android:theme="@style/CustomRadioTheme"
+                                    android:layout_marginLeft="@dimen/d10"
+                                    android:button="@null"
+                                    android:drawableLeft="@drawable/radio_button_selector_bg"
+                                    android:drawablePadding="@dimen/d5"
                                     android:textSize="14px" />
                             </RadioGroup>
 
@@ -1459,7 +1486,10 @@
                                     android:layout_height="wrap_content"
                                     android:text="@string/str_yes"
                                     android:textColor="@drawable/radio_button_selector_txt"
-                                    android:theme="@style/CustomRadioTheme"
+
+                                    android:button="@null"
+                                    android:drawableLeft="@drawable/radio_button_selector_bg"
+                                    android:drawablePadding="@dimen/d5"
                                     android:textSize="14px" />
 
                                 <RadioButton
@@ -1468,7 +1498,10 @@
                                     android:layout_height="wrap_content"
                                     android:text="@string/str_no"
                                     android:textColor="@drawable/radio_button_selector_txt"
-                                    android:theme="@style/CustomRadioTheme"
+                                    android:layout_marginLeft="@dimen/d10"
+                                    android:button="@null"
+                                    android:drawableLeft="@drawable/radio_button_selector_bg"
+                                    android:drawablePadding="@dimen/d5"
                                     android:textSize="14px" />
                             </RadioGroup>
 
@@ -1502,7 +1535,10 @@
                                     android:layout_height="wrap_content"
                                     android:text="@string/str_yes"
                                     android:textColor="@drawable/radio_button_selector_txt"
-                                    android:theme="@style/CustomRadioTheme"
+
+                                    android:button="@null"
+                                    android:drawableLeft="@drawable/radio_button_selector_bg"
+                                    android:drawablePadding="@dimen/d5"
                                     android:textSize="14px" />
 
                                 <RadioButton
@@ -1511,7 +1547,10 @@
                                     android:layout_height="wrap_content"
                                     android:text="@string/str_no"
                                     android:textColor="@drawable/radio_button_selector_txt"
-                                    android:theme="@style/CustomRadioTheme"
+                                    android:layout_marginLeft="@dimen/d10"
+                                    android:button="@null"
+                                    android:drawableLeft="@drawable/radio_button_selector_bg"
+                                    android:drawablePadding="@dimen/d5"
                                     android:textSize="14px" />
                             </RadioGroup>
 

+ 63 - 0
android_host/src/main/res/layout/main_br_delete_dialog.xml

@@ -0,0 +1,63 @@
+<?xml version="1.0" encoding="utf-8"?>
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    android:gravity="center"
+    android:background="@android:color/transparent">
+
+    <LinearLayout
+        android:layout_width="481dp"
+        android:layout_height="280dp"
+        android:gravity="center"
+        android:orientation="vertical"
+        android:background="@drawable/shape_bed_bg"
+        >
+    <ImageView
+        android:layout_width="@dimen/d78"
+        android:layout_height="@dimen/d78"
+        android:src="@mipmap/br_shan"
+        android:layout_marginTop="@dimen/d32" />
+
+    <TextView
+        android:id="@+id/br_delete_tip_text"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:layout_marginTop="20dp"
+        android:text="确认删除该广播"
+        android:textColor="@color/black"
+        android:textStyle="bold"
+        android:textSize="@dimen/font_size_18"
+        android:gravity="center" />
+
+    <LinearLayout
+        android:layout_width="@dimen/d383"
+        android:layout_height="@dimen/d52"
+        android:layout_marginTop="@dimen/d24"
+        android:layout_marginBottom="@dimen/d38"
+        android:gravity="center_vertical"
+        android:orientation="horizontal">
+        <Button
+            android:id="@+id/br_delete_cancel_button"
+            android:layout_width="@dimen/d176"
+            android:layout_height="@dimen/d48"
+            android:gravity="center"
+            android:background="@drawable/shape_password_bt_bg"
+            android:text="取消"
+            android:textSize="16sp"
+            android:textColor="@drawable/selector_bottom_btn_text_color"/>
+
+        <Button
+            android:id="@+id/br_delete_determine_button"
+            android:layout_width="@dimen/d176"
+            android:layout_height="@dimen/d48"
+            android:gravity="center"
+            android:background="@drawable/shape_br_delete_dialog_bt_bg"
+            android:text="确定"
+            android:textSize="16sp"
+            android:layout_marginLeft="@dimen/d31"
+            android:textColor="@drawable/selector_bottom_btn_text_color"/>
+
+    </LinearLayout>
+
+    </LinearLayout>
+</LinearLayout>

+ 64 - 0
android_host/src/main/res/layout/main_br_play_dialog.xml

@@ -0,0 +1,64 @@
+<?xml version="1.0" encoding="utf-8"?>
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    android:gravity="center"
+    android:background="@android:color/transparent">
+
+    <LinearLayout
+        android:layout_width="481dp"
+        android:layout_height="280dp"
+        android:gravity="center"
+        android:orientation="vertical"
+        android:background="@drawable/shape_bed_bg"
+        >
+    <ImageView
+        android:layout_width="@dimen/d78"
+        android:layout_height="@dimen/d78"
+        android:src="@mipmap/bo"
+        android:layout_marginTop="@dimen/d32" />
+
+    <TextView
+        android:id="@+id/br_delete_tip_text"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:layout_marginTop="20dp"
+        android:text="确认播放该广播"
+        android:textColor="@color/black"
+        android:textStyle="bold"
+        android:textSize="@dimen/font_size_18"
+        android:gravity="center" />
+
+    <LinearLayout
+        android:layout_width="@dimen/d383"
+        android:layout_height="@dimen/d52"
+        android:layout_marginTop="@dimen/d24"
+        android:layout_marginBottom="@dimen/d38"
+        android:gravity="center_vertical"
+        android:orientation="horizontal">
+
+        <Button
+            android:id="@+id/br_play_cancel_button"
+            android:layout_width="@dimen/d176"
+            android:layout_height="@dimen/d48"
+            android:gravity="center"
+            android:background="@drawable/shape_password_bt_bg"
+            android:text="取消"
+            android:textSize="16sp"
+            android:textColor="@drawable/selector_bottom_btn_text_color"/>
+
+        <Button
+            android:id="@+id/br_play_determine_button"
+            android:layout_width="@dimen/d176"
+            android:layout_height="@dimen/d48"
+            android:gravity="center"
+            android:background="@drawable/shape_main_hos_txt_bg"
+            android:text="确定"
+            android:textSize="16sp"
+            android:layout_marginLeft="@dimen/d31"
+            android:textColor="@drawable/selector_bottom_btn_text_color"/>
+
+    </LinearLayout>
+
+    </LinearLayout>
+</LinearLayout>

+ 63 - 0
android_host/src/main/res/layout/main_br_st_dialog.xml

@@ -0,0 +1,63 @@
+<?xml version="1.0" encoding="utf-8"?>
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    android:gravity="center"
+    android:background="@android:color/transparent">
+
+    <LinearLayout
+        android:layout_width="481dp"
+        android:layout_height="280dp"
+        android:gravity="center"
+        android:orientation="vertical"
+        android:background="@drawable/shape_bed_bg"
+        >
+    <ImageView
+        android:layout_width="@dimen/d78"
+        android:layout_height="@dimen/d78"
+        android:src="@mipmap/guangbo"
+        android:layout_marginTop="@dimen/d32" />
+
+    <TextView
+        android:id="@+id/br_st_tip_text"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:layout_marginTop="20dp"
+        android:text="确认试听该广播"
+        android:textColor="@color/black"
+        android:textStyle="bold"
+        android:textSize="@dimen/font_size_18"
+        android:gravity="center" />
+
+    <LinearLayout
+        android:layout_width="@dimen/d383"
+        android:layout_height="@dimen/d52"
+        android:layout_marginTop="@dimen/d24"
+        android:layout_marginBottom="@dimen/d38"
+        android:gravity="center_vertical"
+        android:orientation="horizontal">
+        <Button
+            android:id="@+id/br_st_cancel_button"
+            android:layout_width="@dimen/d176"
+            android:layout_height="@dimen/d48"
+            android:gravity="center"
+            android:background="@drawable/shape_password_bt_bg"
+            android:text="取消"
+            android:textSize="16sp"
+            android:textColor="@drawable/selector_bottom_btn_text_color"/>
+
+        <Button
+            android:id="@+id/br_st_determine_button"
+            android:layout_width="@dimen/d176"
+            android:layout_height="@dimen/d48"
+            android:gravity="center"
+            android:background="@drawable/shape_reinforcements_dialog_bt_bg"
+            android:text="确定"
+            android:textSize="16sp"
+            android:layout_marginLeft="@dimen/d31"
+            android:textColor="@drawable/selector_bottom_btn_text_color"/>
+
+    </LinearLayout>
+
+    </LinearLayout>
+</LinearLayout>

+ 63 - 0
android_host/src/main/res/layout/main_br_stop_dialog.xml

@@ -0,0 +1,63 @@
+<?xml version="1.0" encoding="utf-8"?>
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    android:gravity="center"
+    android:background="@android:color/transparent">
+
+    <LinearLayout
+        android:layout_width="481dp"
+        android:layout_height="280dp"
+        android:gravity="center"
+        android:orientation="vertical"
+        android:background="@drawable/shape_bed_bg"
+        >
+    <ImageView
+        android:layout_width="@dimen/d78"
+        android:layout_height="@dimen/d78"
+        android:src="@mipmap/stop_br"
+        android:layout_marginTop="@dimen/d32" />
+
+    <TextView
+        android:id="@+id/br_delete_tip_text"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:layout_marginTop="20dp"
+        android:text="确认停止该广播"
+        android:textColor="@color/black"
+        android:textStyle="bold"
+        android:textSize="@dimen/font_size_18"
+        android:gravity="center" />
+
+    <LinearLayout
+        android:layout_width="@dimen/d383"
+        android:layout_height="@dimen/d52"
+        android:layout_marginTop="@dimen/d24"
+        android:layout_marginBottom="@dimen/d38"
+        android:gravity="center_vertical"
+        android:orientation="horizontal">
+        <Button
+            android:id="@+id/br_stop_cancel_button"
+            android:layout_width="@dimen/d176"
+            android:layout_height="@dimen/d48"
+            android:gravity="center"
+            android:background="@drawable/shape_password_bt_bg"
+            android:text="取消"
+            android:textSize="16sp"
+            android:textColor="@drawable/selector_bottom_btn_text_color"/>
+
+        <Button
+            android:id="@+id/br_stop_determine_button"
+            android:layout_width="@dimen/d176"
+            android:layout_height="@dimen/d48"
+            android:gravity="center"
+            android:background="@drawable/shape_br_stop_dialog_bt_bg"
+            android:text="确定"
+            android:textSize="16sp"
+            android:layout_marginLeft="@dimen/d31"
+            android:textColor="@drawable/selector_bottom_btn_text_color"/>
+
+    </LinearLayout>
+
+    </LinearLayout>
+</LinearLayout>

+ 22 - 0
android_host/src/main/res/layout/view_title_layout.xml

@@ -42,6 +42,28 @@
             android:textSize="@dimen/font_size_18" />
     </LinearLayout>
 
+       <com.wdkl.ncs.android.lib.widget.MarqueeTextView
+           android:id="@+id/tv_broadcast_state"
+           android:layout_width="100dp"
+           android:layout_height="wrap_content"
+           android:layout_marginRight="8dp"
+           android:drawableLeft="@drawable/ic_broadcast"
+           android:drawablePadding="4dp"
+           android:ellipsize="marquee"
+           android:focusable="true"
+           android:focusableInTouchMode="true"
+           android:marqueeRepeatLimit="-1"
+           android:singleLine="true"
+           android:text="@string/broadcast_playing"
+           android:textColor="@color/red_color"
+           android:textSize="20sp"
+           android:visibility="gone"
+           android:layout_marginLeft="@dimen/d22"
+           android:layout_centerVertical="true"
+           android:layout_toRightOf="@+id/view_title_layout_return"
+          />
+
+
        <ImageView
            android:id="@+id/view_title_layout_tv_no_img"
            android:layout_width="@dimen/d22"

二進制
android_host/src/main/res/mipmap-mdpi/jian_bai.png


二進制
android_host/src/main/res/mipmap-mdpi/xia.png


二進制
android_host/src/main/res/mipmap-mdpi/xia_h.png


二進制
android_host/src/main/res/mipmap-xhdpi/br_shan.png


二進制
android_host/src/main/res/mipmap-xhdpi/jian_bai.png


二進制
android_host/src/main/res/mipmap-xhdpi/stop_br.png


二進制
android_host/src/main/res/mipmap-xxhdpi/jian_bai.png


二進制
android_host/src/main/res/mipmap-xxhdpi/stop_br.png


二進制
app/release/app-release.apk


+ 0 - 1
app/release/output.json

@@ -1 +0,0 @@
-[{"outputType":{"type":"APK"},"apkInfo":{"type":"MAIN","splits":[],"versionCode":1},"path":"app-release.apk","properties":{"packageId":"com.enation.app.javashop","split":"","minSdkVersion":"17"}}]

+ 2 - 2
build.gradle

@@ -47,8 +47,8 @@ buildscript {
     /**
      * 配置要打包的模块
      */
-    ext.callingdoor = true
-    ext.android_bed = false
+    ext.callingdoor = false
+    ext.android_bed = true
     ext.android_host = false
     ext.is_mom = false
 

+ 12 - 3
common/src/main/code/com/wdkl/ncs/android/lib/utils/TimeHandle.kt

@@ -18,13 +18,13 @@ object TimeHandle {
         cal.set(Calendar.MILLISECOND, 0)
         return cal.timeInMillis
     }
-    fun stampToDateTime(s:Long):String{
-        return TimeStampToTime(s,"MM-dd HH:mm:ss")
+    fun stampToDateTime(s: Long):String{
+        return TimeStampToTime(s, "MM-dd HH:mm:ss")
     }
     /**
      * 时间戳转时间 不带时区
      */
-    fun TimeStampToTime(s:Long, timestamp:String):String{
+    fun TimeStampToTime(s: Long, timestamp: String):String{
         val res: String
         val simpleDateFormat = SimpleDateFormat(timestamp)
         val lt = s
@@ -141,4 +141,13 @@ object TimeHandle {
 
         return 0
     }
+
+    /**
+     * 获取日期
+     * @return
+     */
+    fun getDataTimes(dataFormat: String, date: Date): String {
+        val format = SimpleDateFormat(dataFormat)
+        return format.format(date)
+    }
 }

+ 197 - 0
common/src/main/code/com/wdkl/ncs/android/lib/widget/VoiceLoadingView.java

@@ -0,0 +1,197 @@
+package com.wdkl.ncs.android.lib.widget;
+
+import android.animation.FloatEvaluator;
+import android.content.Context;
+import android.content.res.TypedArray;
+import android.graphics.Canvas;
+import android.graphics.Color;
+import android.graphics.Paint;
+import android.util.AttributeSet;
+import android.view.View;
+
+import com.wdkl.ncs.android.lib.R;
+
+import java.util.Random;
+
+import androidx.annotation.Nullable;
+
+public class VoiceLoadingView extends View implements Runnable {
+    /**
+     * 随机数
+     */
+    private static final Random mRandom = new Random();
+
+    /**
+     * View默认最小宽度
+     */
+    private static final int DEFAULT_MIN_WIDTH = 65;
+
+    /**
+     * 默认4条音轨
+     */
+    private static final int DEFAULT_RAIL_COUNT = 4;
+
+    /**
+     * 控件宽
+     */
+    private int mViewWidth;
+    /**
+     * 控件高
+     */
+    private int mViewHeight;
+    /**
+     * 画笔
+     */
+    private Paint mPaint;
+    /**
+     * 音轨数量
+     */
+    private int mRailCount;
+    /**
+     * 音轨颜色
+     */
+    private int mRailColor;
+    /**
+     * 每条音轨的线宽
+     */
+    private float mRailLineWidth;
+    /**
+     * Float类型估值器,用于在指定数值区域内进行估值
+     */
+    private FloatEvaluator mFloatEvaluator;
+
+    public VoiceLoadingView(Context context) {
+        this(context, null);
+    }
+
+    public VoiceLoadingView(Context context, @Nullable AttributeSet attrs) {
+        this(context, attrs, 0);
+    }
+
+    public VoiceLoadingView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
+        super(context, attrs, defStyleAttr);
+        init(context, attrs, defStyleAttr);
+    }
+
+    private void init(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
+        initAttr(context, attrs, defStyleAttr);
+        mPaint = new Paint();
+        mPaint.setColor(mRailColor);
+        mPaint.setStrokeWidth(mRailLineWidth);
+        mPaint.setStyle(Paint.Style.FILL);
+        //设置笔触为方形
+        mPaint.setStrokeCap(Paint.Cap.SQUARE);
+        mPaint.setAntiAlias(true);
+        mFloatEvaluator = new FloatEvaluator();
+    }
+
+    private void initAttr(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
+        TypedArray array = context.obtainStyledAttributes(attrs, R.styleable.VoiceLoadingView, defStyleAttr, 0);
+        mRailCount = array.getInt(R.styleable.VoiceLoadingView_cmlv_rail_count, DEFAULT_RAIL_COUNT);
+        mRailColor = array.getColor(R.styleable.VoiceLoadingView_cmlv_rail_color, Color.argb(255, 255, 0, 0));
+        mRailLineWidth = array.getDimension(R.styleable.VoiceLoadingView_cmlv_line_width, dip2px(context, 1f));
+        array.recycle();
+    }
+
+    @Override
+    protected void onSizeChanged(int w, int h, int oldw, int oldh) {
+        super.onSizeChanged(w, h, oldw, oldh);
+        mViewWidth = w;
+        mViewHeight = h;
+    }
+
+    @Override
+    protected void onDraw(Canvas canvas) {
+        super.onDraw(canvas);
+        //计算可用高度
+        float totalAvailableHeight = mViewHeight - getPaddingBottom() - getPaddingTop();
+        //计算每条音轨平分宽度后的位置
+        float averageBound = (mViewWidth * 1.0f) / mRailCount;
+        //计算每条音轨的x坐标位置
+        float x = averageBound - mRailLineWidth;
+        float y = getPaddingBottom();
+        //旋转画布,按控件中心旋转180度,即可让音轨反转
+        canvas.rotate(180, mViewWidth / 2f, mViewHeight / 2f);
+        //保存画布
+        canvas.save();
+        for (int i = 1; i <= mRailCount; i++) {
+            //估值x坐标
+            float fraction = nextRandomFloat(1.0f);
+            float evaluateY = (mFloatEvaluator.evaluate(fraction, 0.3f, 0.9f)) * totalAvailableHeight;
+            //第一个不需要偏移
+            if (i == 1) {
+                canvas.drawLine(x, y, x, evaluateY, mPaint);
+            } else {
+                //后续,每个音轨都固定偏移间距后,再画
+                canvas.translate(x, 0);
+                canvas.drawLine(x, y, x, evaluateY, mPaint);
+            }
+        }
+        //恢复画布
+        canvas.restore();
+    }
+
+    @Override
+    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
+        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
+        setMeasuredDimension(handleMeasure(widthMeasureSpec), handleMeasure(heightMeasureSpec));
+    }
+
+    /**
+     * 处理MeasureSpec
+     */
+    private int handleMeasure(int measureSpec) {
+        int result = DEFAULT_MIN_WIDTH;
+        int specMode = MeasureSpec.getMode(measureSpec);
+        int specSize = MeasureSpec.getSize(measureSpec);
+        if (specMode == MeasureSpec.EXACTLY) {
+            result = specSize;
+        } else {
+            //处理wrap_content的情况
+            if (specMode == MeasureSpec.AT_MOST) {
+                result = Math.min(result, specSize);
+            }
+        }
+        return result;
+    }
+
+    @Override
+    protected void onAttachedToWindow() {
+        super.onAttachedToWindow();
+        //start();
+    }
+
+    @Override
+    protected void onDetachedFromWindow() {
+        super.onDetachedFromWindow();
+        stop();
+    }
+
+    @Override
+    public void run() {
+        invalidate();
+        postDelayed(this, 100);
+    }
+
+    public void start() {
+        postDelayed(this, 300);
+    }
+
+    public void stop() {
+        removeCallbacks(this);
+    }
+
+    public static int dip2px(Context context, float dipValue) {
+        final float scale = context.getResources().getDisplayMetrics().density;
+        return (int) (dipValue * scale + 0.5f);
+    }
+
+    /**
+     * 产生一个随机float
+     *
+     * @param sl 随机数范围[0,sl)
+     */
+    public static float nextRandomFloat(float sl) {
+        return mRandom.nextFloat() * sl;
+    }
+}

+ 9 - 0
common/src/main/res/values/attrs.xml

@@ -33,6 +33,15 @@
         <attr name="background_color" format="color|reference"/>
     </declare-styleable>
 
+    <declare-styleable name="VoiceLoadingView">
+        <!-- 音轨数量 -->
+        <attr name="cmlv_rail_count" format="integer" />
+        <!-- 音轨的颜色 -->
+        <attr name="cmlv_rail_color" format="color" />
+        <!-- 音轨线宽粗细 -->
+        <attr name="cmlv_line_width" format="integer|float|dimension" />
+    </declare-styleable>
+
     <declare-styleable name="StarView">
         <attr name="star" format="integer"/>
         <attr name="selectImage" format="reference"/>

+ 1 - 1
middleware/src/main/code/com/wdkl/ncs/android/middleware/api/BroadcastApi.kt

@@ -37,7 +37,7 @@ interface BroadcastApi {
      * 修改广播
      */
     @PUT("/deviceNurse/broadcast/{id}")
-    fun modificationBroadcast(@Query("id")id:Int,@Query("unionId")unionId:String
+    fun modificationBroadcast(@Path("id")id:Int,@Query("unionId")unionId:String
                               ,@Query("createTime")createTime:Int,@Query("updateTime")updateTime:Int
                               ,@Query("partId")partId:Int,@Query("broadcastMode")broadcastMode:Int
                               ,@Query("playStart")playStart:String,@Query("playEnd")playEnd:String

+ 16 - 1
middleware/src/main/code/com/wdkl/ncs/android/middleware/common/Constant.java

@@ -246,8 +246,18 @@ public class Constant {
     public static String targetSipId = "";   //来电设备id
     public static boolean  showCall = false;
     public static boolean  IN_CALL = false;
+    public static String  RTC_URL = "";
+    public static int  RTC_port = 0;
+
+
+    //广播
+    public static boolean gstreamer_init = false;
+    public static int selectBcId = 0;
+    public static boolean bcStart = false;
+    public static String bcFrameIds = "[0]";
+    public static int bcInteractionId = -1;
+    public static int bcVoiceId = 0;
 
-    public static boolean /**/gstreamer_init = false;
 
 
     public static int targetDeviceId = 60;//呼叫对方设备id
@@ -340,12 +350,15 @@ public class Constant {
     public static final int EVENT_REMOVE_CALL = 0x16;
 
     public static final int EVENT_SIGNIN_MSG = 0x21;
+
     /**
      * sip 通话
      */
     public static final int SIP_CONNECTED = 0x23;
     public static final int EVENT_END_CALL = 0x24;
 
+
+
     //新增
     public static final int EVENT_BLE_START = 0x100;
     public static final int EVENT_BLE_STOP = 0x101;
@@ -379,6 +392,8 @@ public class Constant {
     //退出广播设置
     public static final int EVENT_r_br_set = 0x115;
 
+    public static final int EVENT_BROADCAST_STATE = 0x27;
+
     /**
      * 退出医护
      * */

+ 52 - 0
middleware/src/main/code/com/wdkl/ncs/android/middleware/logic/contract/nursehome/BroadcastListContract.kt

@@ -0,0 +1,52 @@
+package com.wdkl.ncs.android.middleware.logic.contract.nursehome
+
+import com.wdkl.ncs.android.lib.base.BaseContract
+import com.wdkl.ncs.android.middleware.model.annotation.Id
+import com.wdkl.ncs.android.middleware.model.dos.BroadcastDO
+import com.wdkl.ncs.android.middleware.model.vo.BroadcastListVO
+import com.wdkl.ncs.android.middleware.model.vo.BroadcastVO
+
+/**
+ * 获取广播列表接口
+ */
+interface BroadcastListContract {
+    /**
+     * 显示广播列表
+     */
+    interface View: BaseContract.BaseView{
+
+        fun showData(data : ArrayList<BroadcastVO>)
+
+        fun StopAudioData(data : ArrayList<BroadcastVO>)
+
+        fun DELETEData(data : ArrayList<BroadcastVO>)
+
+        fun showDatas(data : ArrayList<BroadcastVO>)
+
+        fun showMusic(data : BroadcastListVO)
+
+    }
+
+    /**
+     * 获取广播数据
+     */
+  interface Presenter:BaseContract.BasePresenter{
+       //根据科室id获取广播列表,不分页
+      fun loadData(part_id:Int)
+
+      fun loadDatas(pageNumber:Int,pageNumberSize:Int)
+
+      //停止播放广播
+      fun StopAudio(id: Int,part_id:Int)
+
+      //删除广播
+      fun broadcast(part_id:Array<String>)
+
+      //播放广播接口?
+      fun getBroadcastFileList(id: Int)
+
+
+  }
+
+
+}

+ 46 - 0
middleware/src/main/code/com/wdkl/ncs/android/middleware/logic/contract/nursehome/BroadcastSetContract.kt

@@ -0,0 +1,46 @@
+package com.wdkl.ncs.android.middleware.logic.contract.nursehome
+
+import com.wdkl.ncs.android.lib.base.BaseContract
+import com.wdkl.ncs.android.middleware.model.dos.BroadcastDO
+import com.wdkl.ncs.android.middleware.model.vo.BroadcastVO
+import com.wdkl.ncs.android.middleware.model.vo.GroupBrVo
+
+/**
+ * 获取广播列表接口
+ */
+interface BroadcastSetContract {
+    /**
+     * 显示广播列表
+     */
+    interface View: BaseContract.BaseView{
+
+        fun showData(data : BroadcastVO)
+
+        fun showQyData(data : ArrayList<GroupBrVo>)
+
+        fun showsetData(data : BroadcastVO)
+
+    }
+
+
+  interface Presenter:BaseContract.BasePresenter{
+      /**
+       * 获取广播数据
+       */
+      fun loadData(id:Int)
+      /**
+       * 获取区域接口
+       */
+      fun loadQyData(part_id:Int)
+      /**
+       * 获取区域接口
+       */
+      fun loasetData(id:Int,unionId:String,createTime : Int ,updateTime : Int ,partId : Int ,broadcastMode : Int
+                     ,playStart : String ,playEnd : String ,playMode : Int ,repeatTimes : Int ,repeatDay : String
+                     ,status : Boolean ,groupIds : String ,frameIds : String ,title : String ,audioPort : Int
+                     ,videoPort : Int,roomNo : Int)
+
+  }
+
+
+}

+ 28 - 0
middleware/src/main/code/com/wdkl/ncs/android/middleware/logic/contract/nursehome/BroadcasthhContract.kt

@@ -0,0 +1,28 @@
+package com.wdkl.ncs.android.middleware.logic.contract.nursehome
+
+import com.wdkl.ncs.android.lib.base.BaseContract
+import com.wdkl.ncs.android.middleware.model.dos.BroadcastDO
+import com.wdkl.ncs.android.middleware.model.vo.GroupBrVo
+
+/**
+ * 获取广播列表接口
+ */
+interface BroadcasthhContract {
+    /**
+     * 显示广播列表
+     */
+    interface View: BaseContract.BaseView{
+
+        fun showData(data : ArrayList<GroupBrVo>)
+    }
+
+    /**
+     * 获取广播数据
+     */
+  interface Presenter:BaseContract.BasePresenter{
+
+      fun loadData(part_id:Int)
+  }
+
+
+}

+ 128 - 0
middleware/src/main/code/com/wdkl/ncs/android/middleware/logic/presenter/nursehome/BroadcastListPresenter.kt

@@ -0,0 +1,128 @@
+package com.wdkl.ncs.android.middleware.logic.presenter.nursehome
+
+import com.enation.javashop.net.engine.plugin.connection.ConnectionQuality
+import com.enation.javashop.net.engine.plugin.exception.ExceptionHandle
+import com.enation.javashop.net.engine.utils.ThreadFromUtils
+import com.google.gson.FieldNamingPolicy
+import com.google.gson.GsonBuilder
+import com.wdkl.ncs.android.lib.base.RxPresenter
+import com.wdkl.ncs.android.lib.utils.*
+import com.wdkl.ncs.android.lib.utils.valueJsonArray
+import com.wdkl.ncs.android.middleware.api.BroadcastApi
+import com.wdkl.ncs.android.middleware.di.MiddlewareDaggerComponent
+import com.wdkl.ncs.android.middleware.logic.contract.nursehome.BroadcastContract
+import com.wdkl.ncs.android.middleware.logic.contract.nursehome.BroadcastListContract
+import com.wdkl.ncs.android.middleware.model.ServerInfo
+import com.wdkl.ncs.android.middleware.model.dos.*
+import com.wdkl.ncs.android.middleware.model.dto.TcpSeverDTO
+import com.wdkl.ncs.android.middleware.model.vo.*
+import io.reactivex.disposables.Disposable
+import javax.inject.Inject
+
+/**
+ * BroadcastFragment逻辑控制
+ */
+class BroadcastListPresenter@Inject constructor() :RxPresenter<BroadcastListContract.View>(),BroadcastListContract.Presenter {
+
+
+    /**
+     *广播api
+     */
+    @Inject
+    protected lateinit var broadcastApi: BroadcastApi
+
+    /**
+     *依赖注入初始化
+     */
+    override fun bindDagger() {
+        MiddlewareDaggerComponent.component.inject(this)
+    }
+
+    /**
+     * 数据监听者
+     */
+    private val observable = object: ConnectionObserver<Any>(){
+        override fun onStartWithConnection() {
+            providerView()
+        }
+
+        override fun onNextWithConnection(result: Any, connectionQuality: ConnectionQuality) {
+            providerView().complete()
+            when (result) {
+                is BroadcastListVO -> {
+                    //设备信息
+                    providerView().showMusic(result)
+                }
+
+                is ArrayList<*> ->{
+                    providerView().showData(result as ArrayList<BroadcastVO>)
+                }
+            }
+
+        }
+
+        override fun onErrorWithConnection(error: ExceptionHandle.ResponeThrowable, connectionQuality: ConnectionQuality) {
+            providerView().onError(error.customMessage)
+        }
+
+        override fun attachSubscribe(var1: Disposable) {
+        addDisposable(var1)
+        }
+
+    }
+
+    /**
+     *获取广播列表
+     */
+    override fun loadData(part_id:Int) {
+        broadcastApi.getListByPartId(part_id).map {
+            var broadcastList = ArrayList<BroadcastVO>()
+            var gson = GsonBuilder().setFieldNamingPolicy(FieldNamingPolicy.LOWER_CASE_WITH_UNDERSCORES).create()
+            it.toJsonArray().arrayObjects().forEach { dic ->
+                broadcastList.add(gson.fromJson(dic.toString(),BroadcastVO::class.java))
+            }
+            return@map broadcastList
+        }.compose(ThreadFromUtils.defaultSchedulers()).subscribe(observable)
+
+    }
+
+    override fun loadDatas(page_no: Int, pageNumber: Int) {
+        broadcastApi.getBroadcastVo(page_no,pageNumber).map {
+            var broadcastList = ArrayList<BroadcastVO>()
+            var gson = GsonBuilder().setFieldNamingPolicy(FieldNamingPolicy.LOWER_CASE_WITH_UNDERSCORES).create()
+            it.toJsonObject().valueJsonArray("data").arrayObjects().forEach { dic ->
+                broadcastList.add(gson.fromJson(dic.toString(), BroadcastVO::class.java))
+            }
+            return@map broadcastList
+        }.compose(ThreadFromUtils.defaultSchedulers()).subscribe(observable)
+    }
+
+    override fun StopAudio(id: Int, part_id: Int) {
+        broadcastApi.stopBroadcast(id,part_id).map {
+            var broadcastList = ArrayList<BroadcastVO>()
+            var gson = GsonBuilder().setFieldNamingPolicy(FieldNamingPolicy.LOWER_CASE_WITH_UNDERSCORES).create()
+
+            it.toJsonObject().valueJsonArray("data").arrayObjects().forEach { dic ->
+                broadcastList.add(gson.fromJson(dic.toString(), BroadcastVO::class.java))
+            }
+
+            return@map broadcastList
+        }.compose(ThreadFromUtils.defaultSchedulers()).subscribe(observable)
+    }
+
+    override fun broadcast(part_id: Array<String>) {
+
+    }
+
+    override fun getBroadcastFileList(id: Int) {
+        broadcastApi.getBroadcastFileList(id).map {
+
+            var gson = GsonBuilder().setFieldNamingPolicy(FieldNamingPolicy.LOWER_CASE_WITH_UNDERSCORES).create()
+
+            val broadcastlistVO = gson.fromJson(it.getJsonString(), BroadcastListVO::class.java)
+
+            return@map broadcastlistVO
+        }.compose(ThreadFromUtils.defaultSchedulers()).subscribe(observable)
+
+    }
+}

+ 155 - 0
middleware/src/main/code/com/wdkl/ncs/android/middleware/logic/presenter/nursehome/BroadcastSetPresenter.kt

@@ -0,0 +1,155 @@
+package com.wdkl.ncs.android.middleware.logic.presenter.nursehome
+
+import com.enation.javashop.net.engine.plugin.connection.ConnectionQuality
+import com.enation.javashop.net.engine.plugin.exception.ExceptionHandle
+import com.enation.javashop.net.engine.utils.ThreadFromUtils
+import com.google.gson.FieldNamingPolicy
+import com.google.gson.GsonBuilder
+import com.wdkl.ncs.android.lib.base.RxPresenter
+import com.wdkl.ncs.android.lib.utils.*
+import com.wdkl.ncs.android.middleware.api.BroadcastApi
+import com.wdkl.ncs.android.middleware.di.MiddlewareDaggerComponent
+import com.wdkl.ncs.android.middleware.logic.contract.nursehome.BroadcastContract
+import com.wdkl.ncs.android.middleware.logic.contract.nursehome.BroadcastSetContract
+import com.wdkl.ncs.android.middleware.logic.contract.nursehome.BroadcasthhContract
+import com.wdkl.ncs.android.middleware.model.dos.AppVersionDO
+import com.wdkl.ncs.android.middleware.model.dos.BroadcastDO
+import com.wdkl.ncs.android.middleware.model.dos.FrameDO
+import com.wdkl.ncs.android.middleware.model.vo.BroadcastVO
+import com.wdkl.ncs.android.middleware.model.vo.GroupBrVo
+import com.wdkl.ncs.android.middleware.model.vo.NurseDeviceInfoVO
+import io.reactivex.disposables.Disposable
+import javax.inject.Inject
+
+/**
+ * BroadcastFragment逻辑控制
+ */
+class BroadcastSetPresenter@Inject constructor() :RxPresenter<BroadcastSetContract.View>(),BroadcastSetContract.Presenter {
+
+
+    /**
+     *广播api
+     */
+    @Inject
+    protected lateinit var broadcastApi: BroadcastApi
+
+    /**
+     *依赖注入初始化
+     */
+    override fun bindDagger() {
+        MiddlewareDaggerComponent.component.inject(this)
+    }
+
+    /**
+     * 数据监听者
+     */
+    private val observable = object: ConnectionObserver<Any>(){
+        override fun onStartWithConnection() {
+            providerView()
+        }
+
+        override fun onNextWithConnection(result: Any, connectionQuality: ConnectionQuality) {
+            providerView().complete()
+            when (result) {
+                is BroadcastVO -> {
+                    providerView().showData(result)
+                }
+            }
+        }
+
+        override fun onErrorWithConnection(error: ExceptionHandle.ResponeThrowable, connectionQuality: ConnectionQuality) {
+            providerView().onError(error.customMessage)
+        }
+
+        override fun attachSubscribe(var1: Disposable) {
+        addDisposable(var1)
+        }
+    }
+
+
+    private val observable2 = object : ConnectionObserver<Any>() {
+        override fun onStartWithConnection() {
+            providerView()
+        }
+
+        override fun onNextWithConnection(result: Any, connectionQuality: ConnectionQuality) {
+            providerView().complete()
+            providerView().showQyData(result as ArrayList<GroupBrVo>)
+        }
+
+        override fun onErrorWithConnection(
+                error: ExceptionHandle.ResponeThrowable,
+                connectionQuality: ConnectionQuality
+        ) {
+            providerView().onError(error.customMessage)
+        }
+
+        override fun attachSubscribe(var1: Disposable) {
+            addDisposable(var1)
+        }
+
+    }
+
+    private val observable3 = object : ConnectionObserver<Any>() {
+        override fun onStartWithConnection() {
+            providerView()
+        }
+
+        override fun onNextWithConnection(result: Any, connectionQuality: ConnectionQuality) {
+            providerView().complete()
+            when (result) {
+                is BroadcastVO -> {
+                    providerView().showsetData(result)
+                }
+            }
+        }
+
+        override fun onErrorWithConnection(
+                error: ExceptionHandle.ResponeThrowable,
+                connectionQuality: ConnectionQuality
+        ) {
+            providerView().onError(error.customMessage)
+        }
+
+        override fun attachSubscribe(var1: Disposable) {
+            addDisposable(var1)
+        }
+
+    }
+
+    /**
+     *获取广播信息
+     */
+    override fun loadData(id:Int) {
+
+        broadcastApi.getBroadcast(id).map {
+            var gson = GsonBuilder().setFieldNamingPolicy(FieldNamingPolicy.LOWER_CASE_WITH_UNDERSCORES).create()
+            val broadcastList = gson.fromJson(it.getJsonString(), BroadcastVO::class.java)
+            return@map broadcastList
+        }
+                .compose(ThreadFromUtils.defaultSchedulers())
+                .subscribe(observable)
+
+    }
+
+    override fun loadQyData(part_id: Int) {
+        broadcastApi.getFrameGroupByPartId(part_id).map {
+            var groupList = ArrayList<GroupBrVo>()
+            var gson = GsonBuilder().setFieldNamingPolicy(FieldNamingPolicy.LOWER_CASE_WITH_UNDERSCORES).create()
+            it.toJsonArray().arrayObjects().forEach { dic ->
+                groupList.add(gson.fromJson(dic.toString(), GroupBrVo::class.java))
+            }
+            return@map groupList
+        }.compose(ThreadFromUtils.defaultSchedulers()).subscribe(observable2)
+    }
+
+    override fun loasetData(id: Int, unionId: String, createTime: Int, updateTime: Int, partId: Int, broadcastMode: Int, playStart: String, playEnd: String, playMode: Int, repeatTimes: Int, repeatDay: String, status: Boolean, groupIds: String, frameIds: String, title: String, audioPort: Int, videoPort: Int, roomNo: Int) {
+        broadcastApi.modificationBroadcast(id,unionId,createTime,updateTime,partId,
+                broadcastMode,playStart,playEnd,playMode,repeatTimes,repeatDay,
+                status,groupIds,frameIds,title,audioPort,videoPort,roomNo).map {
+            var gson = GsonBuilder().setFieldNamingPolicy(FieldNamingPolicy.LOWER_CASE_WITH_UNDERSCORES).create()
+            val broadcastLists = gson.fromJson(it.getJsonString(), BroadcastVO::class.java)
+            return@map broadcastLists
+        }.compose(ThreadFromUtils.defaultSchedulers()).subscribe(observable3)
+    }
+}

+ 79 - 0
middleware/src/main/code/com/wdkl/ncs/android/middleware/logic/presenter/nursehome/BroadcasthhPresenter.kt

@@ -0,0 +1,79 @@
+package com.wdkl.ncs.android.middleware.logic.presenter.nursehome
+
+import com.enation.javashop.net.engine.plugin.connection.ConnectionQuality
+import com.enation.javashop.net.engine.plugin.exception.ExceptionHandle
+import com.enation.javashop.net.engine.utils.ThreadFromUtils
+import com.google.gson.FieldNamingPolicy
+import com.google.gson.GsonBuilder
+import com.wdkl.ncs.android.lib.base.RxPresenter
+import com.wdkl.ncs.android.lib.utils.*
+import com.wdkl.ncs.android.middleware.api.BroadcastApi
+import com.wdkl.ncs.android.middleware.di.MiddlewareDaggerComponent
+import com.wdkl.ncs.android.middleware.logic.contract.nursehome.BroadcastContract
+import com.wdkl.ncs.android.middleware.logic.contract.nursehome.BroadcasthhContract
+import com.wdkl.ncs.android.middleware.model.dos.BroadcastDO
+import com.wdkl.ncs.android.middleware.model.vo.BroadcastVO
+import com.wdkl.ncs.android.middleware.model.vo.GroupBrVo
+import io.reactivex.disposables.Disposable
+import javax.inject.Inject
+
+/**
+ * BroadcastFragment逻辑控制
+ */
+class BroadcasthhPresenter@Inject constructor() :RxPresenter<BroadcasthhContract.View>(),BroadcasthhContract.Presenter {
+
+
+    /**
+     *广播api
+     */
+    @Inject
+    protected lateinit var broadcastApi: BroadcastApi
+
+    /**
+     *依赖注入初始化
+     */
+    override fun bindDagger() {
+        MiddlewareDaggerComponent.component.inject(this)
+    }
+
+    /**
+     * 数据监听者
+     */
+    private val observable = object: ConnectionObserver<Any>(){
+        override fun onStartWithConnection() {
+            providerView()
+        }
+
+        override fun onNextWithConnection(result: Any, connectionQuality: ConnectionQuality) {
+            providerView().complete()
+            providerView().showData(result as ArrayList<GroupBrVo>)
+        }
+
+        override fun onErrorWithConnection(error: ExceptionHandle.ResponeThrowable, connectionQuality: ConnectionQuality) {
+            providerView().onError(error.customMessage)
+        }
+
+        override fun attachSubscribe(var1: Disposable) {
+        addDisposable(var1)
+        }
+
+    }
+
+    /**
+     *获取广播列表
+     */
+    override fun loadData(part_id:Int) {
+
+        broadcastApi.getFrameGroupByPartId(part_id).map {
+            var broadcastList = ArrayList<GroupBrVo>()
+            var gson = GsonBuilder().setFieldNamingPolicy(FieldNamingPolicy.LOWER_CASE_WITH_UNDERSCORES).create()
+            it.toJsonArray().arrayObjects().forEach { dic ->
+                broadcastList.add(gson.fromJson(dic.toString(),GroupBrVo::class.java))
+            }
+          return@map broadcastList
+        }
+                .compose(ThreadFromUtils.defaultSchedulers())
+                .subscribe(observable)
+
+    }
+}

+ 335 - 0
middleware/src/main/code/com/wdkl/ncs/android/middleware/model/vo/BroadcastListVO.java

@@ -0,0 +1,335 @@
+package com.wdkl.ncs.android.middleware.model.vo;
+
+import java.io.Serializable;
+import java.util.List;
+
+
+public class BroadcastListVO implements Serializable {
+
+    /**
+     * broadcast : {"id":63,"union_id":"65643969cff47e0007e0c84a","create_time":1701067113,"update_time":1701767248,"part_id":1399,"broadcast_mode":1,"play_start":"","play_end":"","play_mode":1,"repeat_times":0,"repeat_day":null,"status":true,"group_ids":"8,9","frame_ids":"1836,1837","title":"测试一","audio_port":0,"video_port":0,"room_no":300004}
+     * broadcast_files : [{"id":46,"create_time":1701678915,"update_time":null,"broadcast_id":63,"file_name":"Richard Clayderman - 秋日私语.mp3","file_url":"upload/broadcast/202312/04/20231204163513685.mp3","file_author":"xiaozhi","part_id":1399,"play_index":1,"file_path":"/opt/audio_files/broadcast/202312/04/20231204163513685.mp3"}]
+     * files_uri : ["/upload/broadcast/202312/04/20231204163513685.mp3"]
+     */
+
+    private BroadcastBean broadcast;
+    private List<BroadcastFilesBean> broadcast_files;
+    private List<String> files_uri;
+
+    public BroadcastBean getBroadcast() {
+        return broadcast;
+    }
+
+    public void setBroadcast(BroadcastBean broadcast) {
+        this.broadcast = broadcast;
+    }
+
+    public List<BroadcastFilesBean> getBroadcast_files() {
+        return broadcast_files;
+    }
+
+    public void setBroadcast_files(List<BroadcastFilesBean> broadcast_files) {
+        this.broadcast_files = broadcast_files;
+    }
+
+    public List<String> getFiles_uri() {
+        return files_uri;
+    }
+
+    public void setFiles_uri(List<String> files_uri) {
+        this.files_uri = files_uri;
+    }
+
+    public static class BroadcastBean implements Serializable {
+        /**
+         * id : 63
+         * union_id : 65643969cff47e0007e0c84a
+         * create_time : 1701067113
+         * update_time : 1701767248
+         * part_id : 1399
+         * broadcast_mode : 1
+         * play_start :
+         * play_end :
+         * play_mode : 1
+         * repeat_times : 0
+         * repeat_day : null
+         * status : true
+         * group_ids : 8,9
+         * frame_ids : 1836,1837
+         * title : 测试一
+         * audio_port : 0
+         * video_port : 0
+         * room_no : 300004
+         */
+
+        private int id;
+        private String union_id;
+        private int create_time;
+        private int update_time;
+        private int part_id;
+        private int broadcast_mode;
+        private String play_start;
+        private String play_end;
+        private int play_mode;
+        private int repeat_times;
+        private Object repeat_day;
+        private boolean status;
+        private String group_ids;
+        private String frame_ids;
+        private String title;
+        private int audio_port;
+        private int video_port;
+        private int room_no;
+
+        public int getId() {
+            return id;
+        }
+
+        public void setId(int id) {
+            this.id = id;
+        }
+
+        public String getUnion_id() {
+            return union_id;
+        }
+
+        public void setUnion_id(String union_id) {
+            this.union_id = union_id;
+        }
+
+        public int getCreate_time() {
+            return create_time;
+        }
+
+        public void setCreate_time(int create_time) {
+            this.create_time = create_time;
+        }
+
+        public int getUpdate_time() {
+            return update_time;
+        }
+
+        public void setUpdate_time(int update_time) {
+            this.update_time = update_time;
+        }
+
+        public int getPart_id() {
+            return part_id;
+        }
+
+        public void setPart_id(int part_id) {
+            this.part_id = part_id;
+        }
+
+        public int getBroadcast_mode() {
+            return broadcast_mode;
+        }
+
+        public void setBroadcast_mode(int broadcast_mode) {
+            this.broadcast_mode = broadcast_mode;
+        }
+
+        public String getPlay_start() {
+            return play_start;
+        }
+
+        public void setPlay_start(String play_start) {
+            this.play_start = play_start;
+        }
+
+        public String getPlay_end() {
+            return play_end;
+        }
+
+        public void setPlay_end(String play_end) {
+            this.play_end = play_end;
+        }
+
+        public int getPlay_mode() {
+            return play_mode;
+        }
+
+        public void setPlay_mode(int play_mode) {
+            this.play_mode = play_mode;
+        }
+
+        public int getRepeat_times() {
+            return repeat_times;
+        }
+
+        public void setRepeat_times(int repeat_times) {
+            this.repeat_times = repeat_times;
+        }
+
+        public Object getRepeat_day() {
+            return repeat_day;
+        }
+
+        public void setRepeat_day(Object repeat_day) {
+            this.repeat_day = repeat_day;
+        }
+
+        public boolean isStatus() {
+            return status;
+        }
+
+        public void setStatus(boolean status) {
+            this.status = status;
+        }
+
+        public String getGroup_ids() {
+            return group_ids;
+        }
+
+        public void setGroup_ids(String group_ids) {
+            this.group_ids = group_ids;
+        }
+
+        public String getFrame_ids() {
+            return frame_ids;
+        }
+
+        public void setFrame_ids(String frame_ids) {
+            this.frame_ids = frame_ids;
+        }
+
+        public String getTitle() {
+            return title;
+        }
+
+        public void setTitle(String title) {
+            this.title = title;
+        }
+
+        public int getAudio_port() {
+            return audio_port;
+        }
+
+        public void setAudio_port(int audio_port) {
+            this.audio_port = audio_port;
+        }
+
+        public int getVideo_port() {
+            return video_port;
+        }
+
+        public void setVideo_port(int video_port) {
+            this.video_port = video_port;
+        }
+
+        public int getRoom_no() {
+            return room_no;
+        }
+
+        public void setRoom_no(int room_no) {
+            this.room_no = room_no;
+        }
+    }
+
+
+    public static class BroadcastFilesBean implements Serializable {
+        /**
+         * id : 46
+         * create_time : 1701678915
+         * update_time : null
+         * broadcast_id : 63
+         * file_name : Richard Clayderman - 秋日私语.mp3
+         * file_url : upload/broadcast/202312/04/20231204163513685.mp3
+         * file_author : xiaozhi
+         * part_id : 1399
+         * play_index : 1
+         * file_path : /opt/audio_files/broadcast/202312/04/20231204163513685.mp3
+         */
+
+        private int id;
+        private int create_time;
+        private Object update_time;
+        private int broadcast_id;
+        private String file_name;
+        private String file_url;
+        private String file_author;
+        private int part_id;
+        private int play_index;
+        private String file_path;
+
+        public int getId() {
+            return id;
+        }
+
+        public void setId(int id) {
+            this.id = id;
+        }
+
+        public int getCreate_time() {
+            return create_time;
+        }
+
+        public void setCreate_time(int create_time) {
+            this.create_time = create_time;
+        }
+
+        public Object getUpdate_time() {
+            return update_time;
+        }
+
+        public void setUpdate_time(Object update_time) {
+            this.update_time = update_time;
+        }
+
+        public int getBroadcast_id() {
+            return broadcast_id;
+        }
+
+        public void setBroadcast_id(int broadcast_id) {
+            this.broadcast_id = broadcast_id;
+        }
+
+        public String getFile_name() {
+            return file_name;
+        }
+
+        public void setFile_name(String file_name) {
+            this.file_name = file_name;
+        }
+
+        public String getFile_url() {
+            return file_url;
+        }
+
+        public void setFile_url(String file_url) {
+            this.file_url = file_url;
+        }
+
+        public String getFile_author() {
+            return file_author;
+        }
+
+        public void setFile_author(String file_author) {
+            this.file_author = file_author;
+        }
+
+        public int getPart_id() {
+            return part_id;
+        }
+
+        public void setPart_id(int part_id) {
+            this.part_id = part_id;
+        }
+
+        public int getPlay_index() {
+            return play_index;
+        }
+
+        public void setPlay_index(int play_index) {
+            this.play_index = play_index;
+        }
+
+        public String getFile_path() {
+            return file_path;
+        }
+
+        public void setFile_path(String file_path) {
+            this.file_path = file_path;
+        }
+    }
+}

+ 239 - 0
middleware/src/main/code/com/wdkl/ncs/android/middleware/model/vo/BroadcastVO.java

@@ -0,0 +1,239 @@
+package com.wdkl.ncs.android.middleware.model.vo;
+
+import java.io.Serializable;
+
+
+
+public class BroadcastVO implements Serializable {
+
+
+    /**
+     * audio_port : 0
+     * broadcast_mode : 0
+     * create_time : 0
+     * frame_ids :
+     * group_ids :
+     * id : 0
+     * part_id : 0
+     * play_end :
+     * play_mode : 0
+     * play_start :
+     * repeat_day :
+     * repeat_times : 0
+     * room_no : 0
+     * status : false
+     * title :
+     * union_id :
+     * update_time : 0
+     * video_port : 0
+     */
+
+    private int audio_port;
+    private int broadcast_mode;
+    private int create_time;
+    private String frame_ids;
+    private String group_ids;
+    private int id;
+    private int part_id;
+    private String play_end;
+    private int play_mode;
+    private String play_start;
+    private String repeat_day;
+    private int repeat_times;
+    private int room_no;
+    private boolean status;
+    private String title;
+    private String union_id;
+    private int update_time;
+    private int video_port;
+    private String group_names;
+    private String frame_names;
+
+    public String getGroup_names() {
+        return group_names;
+    }
+
+    public void setGroup_names(String group_names) {
+        this.group_names = group_names;
+    }
+
+    public String getFrame_names() {
+        return frame_names;
+    }
+
+    public void setFrame_names(String frame_names) {
+        this.frame_names = frame_names;
+    }
+
+    public int getAudio_port() {
+        return audio_port;
+    }
+
+    public void setAudio_port(int audio_port) {
+        this.audio_port = audio_port;
+    }
+
+    public int getBroadcast_mode() {
+        return broadcast_mode;
+    }
+
+    public void setBroadcast_mode(int broadcast_mode) {
+        this.broadcast_mode = broadcast_mode;
+    }
+
+    public int getCreate_time() {
+        return create_time;
+    }
+
+    public void setCreate_time(int create_time) {
+        this.create_time = create_time;
+    }
+
+    public String getFrame_ids() {
+        return frame_ids;
+    }
+
+    public void setFrame_ids(String frame_ids) {
+        this.frame_ids = frame_ids;
+    }
+
+    public String getGroup_ids() {
+        return group_ids;
+    }
+
+    public void setGroup_ids(String group_ids) {
+        this.group_ids = group_ids;
+    }
+
+    public int getId() {
+        return id;
+    }
+
+    public void setId(int id) {
+        this.id = id;
+    }
+
+    public int getPart_id() {
+        return part_id;
+    }
+
+    public void setPart_id(int part_id) {
+        this.part_id = part_id;
+    }
+
+    public String getPlay_end() {
+        return play_end;
+    }
+
+    public void setPlay_end(String play_end) {
+        this.play_end = play_end;
+    }
+
+    public int getPlay_mode() {
+
+
+        return play_mode;
+    }
+
+    public void setPlay_mode(int play_mode) {
+        this.play_mode = play_mode;
+    }
+
+    public String getPlay_start() {
+        return play_start;
+    }
+
+    public void setPlay_start(String play_start) {
+        this.play_start = play_start;
+    }
+
+    public String getRepeat_day() {
+        return repeat_day;
+    }
+
+    public void setRepeat_day(String repeat_day) {
+        this.repeat_day = repeat_day;
+    }
+
+    public int getRepeat_times() {
+        return repeat_times;
+    }
+
+    public void setRepeat_times(int repeat_times) {
+        this.repeat_times = repeat_times;
+    }
+
+    public int getRoom_no() {
+        return room_no;
+    }
+
+    public void setRoom_no(int room_no) {
+        this.room_no = room_no;
+    }
+
+    public boolean isStatus() {
+        return status;
+    }
+
+    public void setStatus(boolean status) {
+        this.status = status;
+    }
+
+    public String getTitle() {
+        return title;
+    }
+
+    public void setTitle(String title) {
+        this.title = title;
+    }
+
+    public String getUnion_id() {
+        return union_id;
+    }
+
+    public void setUnion_id(String union_id) {
+        this.union_id = union_id;
+    }
+
+    public int getUpdate_time() {
+        return update_time;
+    }
+
+    public void setUpdate_time(int update_time) {
+        this.update_time = update_time;
+    }
+
+    public int getVideo_port() {
+        return video_port;
+    }
+
+    public void setVideo_port(int video_port) {
+        this.video_port = video_port;
+    }
+
+    @Override
+    public String toString() {
+        return "BroadcastVO{" +
+                "audio_port=" + audio_port +
+                ", broadcast_mode=" + broadcast_mode +
+                ", create_time=" + create_time +
+                ", frame_ids='" + frame_ids + '\'' +
+                ", group_ids='" + group_ids + '\'' +
+                ", id=" + id +
+                ", part_id=" + part_id +
+                ", play_end='" + play_end + '\'' +
+                ", play_mode=" + play_mode +
+                ", play_start='" + play_start + '\'' +
+                ", repeat_day='" + repeat_day + '\'' +
+                ", repeat_times=" + repeat_times +
+                ", room_no=" + room_no +
+                ", status=" + status +
+                ", title='" + title + '\'' +
+                ", union_id='" + union_id + '\'' +
+                ", update_time=" + update_time +
+                ", video_port=" + video_port +
+                ", group_names='" + group_names + '\'' +
+                ", frame_names='" + frame_names + '\'' +
+                '}';
+    }
+}

+ 83 - 0
middleware/src/main/code/com/wdkl/ncs/android/middleware/model/vo/GroupBrVo.java

@@ -0,0 +1,83 @@
+package com.wdkl.ncs.android.middleware.model.vo;
+
+import java.io.Serializable;
+
+
+public class GroupBrVo implements Serializable {
+
+    /**
+     * id : 12
+     * union_id : 655eaa74ee35880008067a49
+     * create_time : 1700702836
+     * update_time : 1700702850
+     * group_name : 区域一
+     * part_id : 1407
+     */
+
+    private int id;
+    private String union_id;
+    private int create_time;
+    private int update_time;
+    private String group_name;
+    private int part_id;
+
+    public int getId() {
+        return id;
+    }
+
+    public void setId(int id) {
+        this.id = id;
+    }
+
+    public String getUnion_id() {
+        return union_id;
+    }
+
+    public void setUnion_id(String union_id) {
+        this.union_id = union_id;
+    }
+
+    public int getCreate_time() {
+        return create_time;
+    }
+
+    public void setCreate_time(int create_time) {
+        this.create_time = create_time;
+    }
+
+    public int getUpdate_time() {
+        return update_time;
+    }
+
+    public void setUpdate_time(int update_time) {
+        this.update_time = update_time;
+    }
+
+    public String getGroup_name() {
+        return group_name;
+    }
+
+    public void setGroup_name(String group_name) {
+        this.group_name = group_name;
+    }
+
+    public int getPart_id() {
+        return part_id;
+    }
+
+    public void setPart_id(int part_id) {
+        this.part_id = part_id;
+    }
+
+    @Override
+    public String toString() {
+        return "GroupBrVo{" +
+                "id=" + id +
+                ", union_id='" + union_id + '\'' +
+                ", create_time=" + create_time +
+                ", update_time=" + update_time +
+                ", group_name='" + group_name + '\'' +
+                ", part_id=" + part_id +
+                '}';
+    }
+}

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

@@ -110,6 +110,9 @@ public class TcpClientHandler extends SimpleChannelInboundHandler<String> {
                                     if (transaction != null) {
                                         JSONObject jsonObject = new JSONObject();
                                         jsonObject.put(TcpCallback.CALLBACK, TcpCallback.CALLBACK_SUCCESS);
+                                        if (tcpModel.getData() != null) {
+                                            jsonObject.put(TcpCallback.CALLBACK_DATA, tcpModel.getData());
+                                        }
                                         transaction.onSuccess(jsonObject);
                                         trantCache.remove(tcpModel.getTid());
                                     }

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

@@ -0,0 +1,60 @@
+package com.wdkl.ncs.android.middleware.tcp.channel;
+
+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 com.wdkl.ncs.android.middleware.utils.AppUtil;
+
+import java.util.HashMap;
+import java.util.Map;
+
+public class BroadcastUtil {
+
+    //音频广播
+    public static TcpModel startAudioBroadcast(Integer fromId, String toIds, Integer broadcastId){
+        TcpModel tcpModel = new TcpModel(null);
+        tcpModel.setType(TcpType.BROADCAST);
+        tcpModel.setAction(TcpAction.BroadcastAction.START);
+        tcpModel.setFromId(fromId);
+        Map map = new HashMap<String, String>();
+        map.put("type", "audio");
+        map.put("toIds", toIds);
+        map.put("bId", broadcastId);
+        tcpModel.setData(map);
+        return tcpModel;
+    }
+
+    //音频广播
+    public static TcpModel startAudioBroadcast(Integer fromId, Integer broadcastId){
+        TcpModel tcpModel = new TcpModel(null);
+        tcpModel.setType(TcpType.BROADCAST);
+        tcpModel.setAction(TcpAction.BroadcastAction.START);
+        tcpModel.setFromId(fromId);
+        tcpModel.setData(broadcastId);
+        return tcpModel;
+    }
+
+    //喊话广播
+    public static TcpModel startVoiceBroadcast(Integer fromId, String toIds){
+        TcpModel tcpModel = new TcpModel(null);
+        tcpModel.setType(TcpType.BROADCAST);
+        tcpModel.setAction(TcpAction.BroadcastAction.START);
+        tcpModel.setFromId(fromId);
+        Map map = new HashMap<String, String>();
+        map.put("type", "voice");
+        map.put("toIds", toIds);
+        tcpModel.setData(map);
+        return tcpModel;
+    }
+
+    public static TcpModel stopBroadcast(Integer fromId, Integer interactionId){
+        TcpModel tcpModel = new TcpModel(null);
+        tcpModel.setType(TcpType.BROADCAST);
+        tcpModel.setAction(TcpAction.BroadcastAction.STOP);
+        tcpModel.setFromId(fromId);
+        if (interactionId != -1) {
+            tcpModel.setData(interactionId);
+        }
+        return tcpModel;
+    }
+}

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

@@ -125,6 +125,8 @@ public class DeviceChannel {
                 break;
             case DEVICE:
             case BROADCAST:
+                EventBus.getDefault().post(new MessageEvent(tcpModel, EVENT_TCP_MSG));
+                break;
             case SOS:
             case SIDE:
             case ENTRACEGUARD:

+ 2 - 0
middleware/src/main/code/com/wdkl/ncs/android/middleware/tcp/dto/TcpCallback.java

@@ -12,6 +12,8 @@ public class TcpCallback {
     public static final String CALLBACK = "CALLBACK";
     public static final String CALLBACK_SUCCESS = "send success";
     public static final String CALLBACK_FAIL = "send fail";
+    public static final String CALLBACK_DATA = "callback_data";
+
 
     private String tid;
 

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

@@ -441,6 +441,7 @@ public interface TcpAction {
     enum DataAction implements TcpAction {
         REFRESH("刷新数据"),
         INTERACTION("刷新交互列表"),
+        REMIND("提醒消息"),
         NO_MATCH("没有匹配");
 
         private final String description;

+ 5 - 0
resource/src/main/res/drawable/shape_br_delete_dialog_bt_bg.xml

@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8"?>
+<shape xmlns:android="http://schemas.android.com/apk/res/android">
+    <solid android:color="#F65F5F" />
+    <corners android:radius="20dp" />
+</shape>

+ 5 - 0
resource/src/main/res/drawable/shape_br_stop_dialog_bt_bg.xml

@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="utf-8"?>
+<shape xmlns:android="http://schemas.android.com/apk/res/android">
+    <solid android:color="#EC3232" />
+    <corners android:radius="20dp" />
+</shape>

二進制
resource/src/main/res/raw/event.mp3


+ 0 - 1
welcome/src/main/AndroidManifest.xml

@@ -5,7 +5,6 @@
         android:allowBackup="true"
         android:label="@string/app_name"
         android:supportsRtl="true">
-
         <activity android:name="com.wdkl.ncs.android.component.welcome.activity.WelcomeActivity"
             android:screenOrientation="nosensor"
             android:launchMode="singleTask">

+ 5 - 4
welcome/src/main/code/com/wdkl/ncs/android/component/welcome/activity/WelcomeActivity.kt

@@ -1,6 +1,7 @@
 package com.wdkl.ncs.android.component.welcome.activity
 
 import android.Manifest
+import android.content.pm.ActivityInfo
 import android.graphics.Color
 import android.os.Build
 import android.util.Log
@@ -8,6 +9,8 @@ import com.enation.javashop.android.jrouter.external.annotation.Router
 import com.enation.javashop.android.welcome.BuildConfig
 import com.enation.javashop.android.welcome.R
 import com.enation.javashop.android.welcome.databinding.ActivityWelcomeBinding
+
+import com.enation.javashop.android.welcome.databinding.ActivityWelcomeHBinding
 import com.enation.javashop.net.engine.model.NetState
 import com.enation.javashop.net.engine.plugin.permission.RxPermissions
 import com.enation.javashop.utils.base.tool.CommonTool
@@ -20,7 +23,7 @@ import com.wdkl.ncs.android.middleware.logic.contract.welcome.WelcomeContract
 import com.wdkl.ncs.android.middleware.logic.presenter.welcome.WelcomePresenter
 import com.wdkl.ncs.android.middleware.model.AdViewModel
 import io.reactivex.Observable
-import kotlinx.android.synthetic.main.activity_welcome.*
+import kotlinx.android.synthetic.main.activity_welcome_h.*
 import org.greenrobot.eventbus.Subscribe
 import org.greenrobot.eventbus.ThreadMode
 import java.util.*
@@ -69,10 +72,8 @@ class WelcomeActivity :BaseActivity<WelcomePresenter, ActivityWelcomeBinding>(),
      * @Note   初始化
      */
     override fun init() {
-        if ( BuildConfig.is_mom.toBoolean()){
+        if (BuildConfig.is_mom.toBoolean()){
             activity_main_inference.setBackgroundResource(R.mipmap.mom_bg)
-        }else{
-            activity_main_inference.setBackgroundResource(R.mipmap.weicome_p)
         }
         AppTool.SystemUI.showNavigationBar(this, false)
         AppTool.SystemUI.ImmersiveWithBottomBarColor(this, Color.BLACK)

+ 8 - 6
welcome/src/main/res/layout-land/activity_welcome.xml

@@ -1,11 +1,13 @@
-<?xml version="1.0" encoding="utf-8"?>
-<layout>
-    <androidx.constraintlayout.widget.ConstraintLayout
-        xmlns:android="http://schemas.android.com/apk/res/android"
+<layout xmlns:android="http://schemas.android.com/apk/res/android">
+
+
+    <RelativeLayout
         android:id="@+id/activity_main_inference"
         android:layout_width="match_parent"
         android:layout_height="match_parent"
-        android:background="@mipmap/weicome">
-    </androidx.constraintlayout.widget.ConstraintLayout>
+        android:background="@mipmap/weicome"
+        >
+
+    </RelativeLayout>
 
 </layout>

+ 8 - 5
welcome/src/main/res/layout/activity_welcome.xml

@@ -1,11 +1,14 @@
 <?xml version="1.0" encoding="utf-8"?>
-<layout>
-    <androidx.constraintlayout.widget.ConstraintLayout
-        xmlns:android="http://schemas.android.com/apk/res/android"
+<layout xmlns:android="http://schemas.android.com/apk/res/android">
+
+
+    <RelativeLayout
         android:id="@+id/activity_main_inference"
         android:layout_width="match_parent"
         android:layout_height="match_parent"
-        android:background="@mipmap/weicome_p">
-    </androidx.constraintlayout.widget.ConstraintLayout>
+        android:background="@mipmap/weicome_p"
+        >
+
+    </RelativeLayout>
 
 </layout>

+ 13 - 0
welcome/src/main/res/layout/activity_welcome_h.xml

@@ -0,0 +1,13 @@
+<layout xmlns:android="http://schemas.android.com/apk/res/android">
+
+
+    <RelativeLayout
+        android:id="@+id/activity_main_inference"
+        android:layout_width="match_parent"
+        android:layout_height="match_parent"
+        android:background="@mipmap/weicome_p"
+        >
+
+    </RelativeLayout>
+
+</layout>