wangjk 4 gadi atpakaļ
vecāks
revīzija
ad29682197
100 mainītis faili ar 4169 papildinājumiem un 250 dzēšanām
  1. 2 1
      app/build.gradle
  2. 2 2
      app/proguard-rules.pro
  3. 6 4
      app/src/main/AndroidManifest.xml
  4. 135 13
      build.gradle
  5. 3 1
      common/build.gradle
  6. 11 0
      common/src/main/code/com/wdkl/ncs/android/lib/base/BaseActivity.kt
  7. 1 0
      common/src/main/code/com/wdkl/ncs/android/lib/core/framework/JavaShopInstrumentationHook.java
  8. 2 0
      gradle.properties
  9. 2 0
      home/build.gradle
  10. 17 10
      home/src/main/AndroidManifest.xml
  11. 146 0
      home/src/main/code/com/wdkl/ncs/android/component/home/activity/WatchCallRecordsActivity.kt
  12. 58 27
      home/src/main/code/com/wdkl/ncs/android/component/home/activity/WatchContractsActivity.kt
  13. 102 0
      home/src/main/code/com/wdkl/ncs/android/component/home/activity/WatchHomeActivity.kt
  14. 105 0
      home/src/main/code/com/wdkl/ncs/android/component/home/activity/WatchRegisterActivity.kt
  15. 256 0
      home/src/main/code/com/wdkl/ncs/android/component/home/adapter/WatchCallRecordsItemAdapter.kt
  16. 8 10
      home/src/main/code/com/wdkl/ncs/android/component/home/adapter/WatchContactsItemAdapter.kt
  17. 13 0
      home/src/main/code/com/wdkl/ncs/android/component/home/common/Constants.kt
  18. 9 2
      home/src/main/code/com/wdkl/ncs/android/component/home/di/HomeComponent.kt
  19. 1 1
      home/src/main/code/com/wdkl/ncs/android/component/home/fragment/HomeFragment.kt
  20. 115 0
      home/src/main/code/com/wdkl/ncs/android/component/home/util/MediaPlayer.kt
  21. 454 0
      home/src/main/code/com/wdkl/ncs/android/component/home/util/NetHelper.java
  22. 30 0
      home/src/main/code/com/wdkl/ncs/android/component/home/util/TimeTransition.kt
  23. BIN
      home/src/main/res/drawable-mdpi/bao_ma_tou_xiang.png
  24. BIN
      home/src/main/res/drawable-mdpi/dian_liang.png
  25. BIN
      home/src/main/res/drawable-mdpi/geng_duo.png
  26. BIN
      home/src/main/res/drawable-mdpi/gu_ke_lie_biao.png
  27. BIN
      home/src/main/res/drawable-mdpi/hu_chu_wei_jie.png
  28. BIN
      home/src/main/res/drawable-mdpi/hu_chu_yi_jie.png
  29. BIN
      home/src/main/res/drawable-mdpi/hu_ru_wei_jie.png
  30. BIN
      home/src/main/res/drawable-mdpi/hu_ru_yi_jie.png
  31. BIN
      home/src/main/res/drawable-mdpi/hu_shi_to_xiang.png
  32. BIN
      home/src/main/res/drawable-mdpi/ju_jie.png
  33. BIN
      home/src/main/res/drawable-mdpi/sip_lian_jie.png
  34. BIN
      home/src/main/res/drawable-mdpi/tong_hu_ji_lu.png
  35. BIN
      home/src/main/res/drawable-mdpi/wei_bo_fang.png
  36. BIN
      home/src/main/res/drawable-mdpi/wei_chu_li.png
  37. BIN
      home/src/main/res/drawable-mdpi/wifi_lian_jie.png
  38. BIN
      home/src/main/res/drawable-mdpi/yi_bo_fang.png
  39. BIN
      home/src/main/res/drawable-mdpi/yi_chu_li.png
  40. BIN
      home/src/main/res/drawable-mdpi/yu_yin_gua_duan.png
  41. BIN
      home/src/main/res/drawable-mdpi/yu_yin_jie_ting.png
  42. BIN
      home/src/main/res/drawable-mdpi/zhe_die.png
  43. 5 0
      home/src/main/res/drawable/sp_event_handled.xml
  44. 8 0
      home/src/main/res/drawable/sp_event_unhandled_bg.xml
  45. 42 0
      home/src/main/res/layout/adapter_client_list.xml
  46. 141 0
      home/src/main/res/layout/adapter_watch_call_records_item.xml
  47. 46 0
      home/src/main/res/layout/adapter_watch_contacts_item.xml
  48. 24 0
      home/src/main/res/layout/watch_activity_call_records.xml
  49. 57 0
      home/src/main/res/layout/watch_activity_dialing_voice.xml
  50. 201 0
      home/src/main/res/layout/watch_activity_home.xml
  51. 13 0
      home/src/main/res/layout/watch_activity_register.xml
  52. 67 0
      home/src/main/res/layout/watch_activity_voice_calls.xml
  53. 0 27
      home/src/main/res/layout/watch_contacts_item.xml
  54. 14 9
      home/src/main/res/layout/watch_contacts_lay.xml
  55. 27 0
      middleware/src/main/code/com/wdkl/ncs/android/middleware/api/ApiManager.kt
  56. 4 4
      middleware/src/main/code/com/wdkl/ncs/android/middleware/api/DeviceApi.kt
  57. 16 0
      middleware/src/main/code/com/wdkl/ncs/android/middleware/api/RegisterDeviceApi.kt
  58. 2 2
      middleware/src/main/code/com/wdkl/ncs/android/middleware/api/UrlManager.kt
  59. 18 0
      middleware/src/main/code/com/wdkl/ncs/android/middleware/api/WatchCallRecordsFragmentApi.kt
  60. 18 0
      middleware/src/main/code/com/wdkl/ncs/android/middleware/api/WatchInitiatorApi.kt
  61. 14 0
      middleware/src/main/code/com/wdkl/ncs/android/middleware/common/Constants.kt
  62. 33 0
      middleware/src/main/code/com/wdkl/ncs/android/middleware/di/ApiProvides.kt
  63. 24 0
      middleware/src/main/code/com/wdkl/ncs/android/middleware/di/ApplicationComponent.kt
  64. 9 4
      middleware/src/main/code/com/wdkl/ncs/android/middleware/di/PresenterComponent.kt
  65. 1 1
      middleware/src/main/code/com/wdkl/ncs/android/middleware/logic/contract/home/WatchActivityContract.kt
  66. 60 0
      middleware/src/main/code/com/wdkl/ncs/android/middleware/logic/contract/home/WatchCallRecordsFragmentContract.kt
  67. 26 0
      middleware/src/main/code/com/wdkl/ncs/android/middleware/logic/contract/home/WatchDeviceContract.kt
  68. 13 0
      middleware/src/main/code/com/wdkl/ncs/android/middleware/logic/contract/home/WatchHomeActivityContract.kt
  69. 17 15
      middleware/src/main/code/com/wdkl/ncs/android/middleware/logic/presenter/home/WatchActivityPresenter.kt
  70. 128 0
      middleware/src/main/code/com/wdkl/ncs/android/middleware/logic/presenter/home/WatchCallRecordsFragmentPresenter.kt
  71. 75 0
      middleware/src/main/code/com/wdkl/ncs/android/middleware/logic/presenter/home/WatchDevicePresenter.kt
  72. 53 0
      middleware/src/main/code/com/wdkl/ncs/android/middleware/logic/presenter/home/WatchHomeActivityPresenter.kt
  73. 365 0
      middleware/src/main/code/com/wdkl/ncs/android/middleware/model/dos/InteractionDO.java
  74. 350 0
      middleware/src/main/code/com/wdkl/ncs/android/middleware/model/vo/InteractionVO.java
  75. 99 28
      middleware/src/main/code/com/wdkl/ncs/android/middleware/model/vo/WatchContactsVO.java
  76. 43 26
      middleware/src/main/code/com/wdkl/ncs/android/middleware/tcp/TcpClient.java
  77. 18 11
      middleware/src/main/code/com/wdkl/ncs/android/middleware/tcp/TcpClientHandler.java
  78. 58 14
      middleware/src/main/code/com/wdkl/ncs/android/middleware/tcp/channel/DeviceChannel.java
  79. 15 0
      middleware/src/main/code/com/wdkl/ncs/android/middleware/tcp/channel/DeviceUtil.java
  80. 4 4
      middleware/src/main/code/com/wdkl/ncs/android/middleware/tcp/channel/EventUtil.java
  81. 1 1
      middleware/src/main/code/com/wdkl/ncs/android/middleware/tcp/channel/ImUtil.java
  82. 24 9
      middleware/src/main/code/com/wdkl/ncs/android/middleware/tcp/channel/VoiceUtil.java
  83. 24 6
      middleware/src/main/code/com/wdkl/ncs/android/middleware/tcp/dto/TcpModel.java
  84. 15 16
      middleware/src/main/code/com/wdkl/ncs/android/middleware/tcp/enums/TcpAction.java
  85. 26 0
      middleware/src/main/code/com/wdkl/ncs/android/middleware/utils/MessageEvent.kt
  86. 1 1
      resource/src/main/res/values/strings.xml
  87. 1 1
      settings.gradle
  88. 1 0
      starRTC/.gitignore
  89. 61 0
      starRTC/build.gradle
  90. BIN
      starRTC/libs/arm64-v8a/libstarCore.so
  91. BIN
      starRTC/libs/arm64-v8a/libstarRTC.so
  92. BIN
      starRTC/libs/armeabi-v7a/libstarCore.so
  93. BIN
      starRTC/libs/armeabi-v7a/libstarRTC.so
  94. BIN
      starRTC/libs/star_rtc_sdk.jar
  95. 21 0
      starRTC/proguard-rules.pro
  96. 27 0
      starRTC/src/androidTest/java/com/starrtc/demo/ExampleInstrumentedTest.java
  97. 205 0
      starRTC/src/main/AndroidManifest.xml
  98. 10 0
      starRTC/src/main/java/com/starrtc/demo/App.java
  99. 166 0
      starRTC/src/main/java/com/starrtc/demo/database/CoreDB.java
  100. 0 0
      starRTC/src/main/java/com/starrtc/demo/database/HistoryBean.java

+ 2 - 1
app/build.gradle

@@ -15,7 +15,7 @@ android {
     aaptOptions.cruncherEnabled = false
     aaptOptions.useNewCruncher = false
     defaultConfig {
-        applicationId "com.enation.app.javashop"
+        applicationId "com.wdkl.app.ncs.watch"
         minSdkVersion min_sdk_version
         targetSdkVersion target_sdk_version
         versionCode app_version_code
@@ -108,6 +108,7 @@ dependencies {
      */
     compile 'com.android.support.constraint:constraint-layout:1.1.0-beta5'
     implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
+    compile project(':starRTC')
 }
 repositories {
     mavenCentral()

+ 2 - 2
app/proguard-rules.pro

@@ -176,9 +176,9 @@
 # 在开发的时候我们可以将所有的实体类放在一个包内,这样我们写一次混淆就行了。
 -keep class com.wdkl.ncs.android.middleware.model.**{ *; }
 
--keep class com.enation.app.javashop.**{ *; }
+-keep class com.wdkl.app.ncs.watch.**{ *; }
 
--keep class com.enation.app.javashop.**{ *; }
+-keep class com.wdkl.app.ncs.watch.**{ *; }
 
 -keep class com.enation.javashop.android.component.member.adapterPostCommentGoodsAdapter
 -keep class com.wdkl.ncs.android.component.shop.adapter.ShopAllGoodsAdapter

+ 6 - 4
app/src/main/AndroidManifest.xml

@@ -31,13 +31,15 @@
             android:value="GlideModule" />
         <meta-data
             android:name="design_width_in_dp"
-            android:value="360"/>
+            android:value="640"/>
         <meta-data
             android:name="design_height_in_dp"
-            android:value="640"/>
+            android:value="400"/>
 
-        <activity android:name="com.wdkl.ncs.android.component.welcome.activity.WelcomeActivity"
-            >
+<!--        <activity android:name="com.wdkl.ncs.android.component.welcome.activity.WelcomeActivity"-->
+<!--            >-->
+        <activity android:name="com.wdkl.ncs.android.component.home.activity.WatchRegisterActivity">
+<!--        <activity android:name="com.starrtc.demo.demo.SplashActivity">-->
             <intent-filter>
                 <action android:name="android.intent.action.MAIN"/>
 

+ 135 - 13
build.gradle

@@ -1,8 +1,128 @@
+//buildscript {
+//    /**
+//     * Kotlin统一版本
+//     */
+//    ext.kotlin_version = '1.3.21'
+//
+//    /**
+//     * Aop编制版本
+//     */
+//    ext.aspectj_version = '1.8.9'
+//
+//    /**
+//     * 是否开启单独Module编译
+//     */
+//    ext.componentTag = false
+//
+//    /**
+//     * 路由注解处理器版本
+//     */
+//    ext.router_version = '1.0.2'
+//
+//    /**
+//     * kawo组件化框架版本
+//     */
+//    ext.kawo_version = '1.0.9'
+//
+//    /**
+//     * SDK最小支持版本
+//     */
+//    ext.min_sdk_version = 26
+//
+//    /**
+//     * SDK目标支持版本
+//     */
+//    ext.target_sdk_version = 28
+//
+//    /**
+//     * SDK编译版本
+//     */
+//    ext.build_tools_version = "26.0.2"
+//
+//    /**
+//     * 支持库版本
+//     */
+//    ext.support_library_version = "26.0.1"
+//
+//    /**
+//     * APP版本码
+//     */
+//    ext.app_version_code = 1
+//
+//    /**
+//     * APP版本号
+//     */
+//    ext.app_version = "1.0"
+//
+//    /**
+//     * 项目依赖库
+//     */
+//    dependencies {
+//        repositories {
+//            /**
+//             * 依赖仓储
+//             */
+//            maven { url 'https://maven.aliyun.com/repository/public' }
+//            maven { url 'https://maven.aliyun.com/repository/google'}
+//            maven { url 'https://jitpack.io' }
+//        }
+//        /**
+//         * Gradle插件
+//         */
+//        classpath 'com.android.tools.build:gradle:3.0.1'
+//
+//        /**
+//         * Kawo组件化插件
+//         */
+//        classpath "com.enation.geamtear.gradle:kawo:$kawo_version"
+//
+//        /**
+//         * KotlinGradle插件
+//         */
+//        classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
+//
+//        /**
+//         * Kotlin辅助工具
+//         */
+//        classpath "org.jetbrains.kotlin:kotlin-android-extensions:$kotlin_version"
+//
+//        /**
+//         * Aop埋点相关
+//         */
+//        classpath "org.aspectj:aspectjtools:$aspectj_version"
+//    }
+//    repositories {
+//        mavenCentral()
+//    }
+//}
+///**
+// * 统一依赖仓储
+// */
+//allprojects {
+//    repositories {
+//        maven { url 'https://maven.aliyun.com/repository/public' }
+//        maven { url 'https://maven.aliyun.com/repository/google'}
+//        maven { url 'https://jitpack.io' }
+//    }
+//    tasks.withType(Javadoc) { // 新增
+//        options.addStringOption('Xdoclint:none', '-quiet')
+//        options.addStringOption('encoding', 'UTF-8')
+//    }
+//}
+//
+///**
+// *  清除Build配置时 删除根目录Build文件夹
+// */
+//task clean(type: Delete) {
+//    delete rootProject.buildDir
+//}
+
+
 buildscript {
     /**
      * Kotlin统一版本
      */
-    ext.kotlin_version = '1.3.21'
+    ext.kotlin_version = '1.2.40'
 
     /**
      * Aop编制版本
@@ -27,7 +147,7 @@ buildscript {
     /**
      * SDK最小支持版本
      */
-    ext.min_sdk_version = 26
+    ext.min_sdk_version = 17
 
     /**
      * SDK目标支持版本
@@ -62,9 +182,9 @@ buildscript {
             /**
              * 依赖仓储
              */
-            maven { url 'https://maven.aliyun.com/repository/public' }
-            maven { url 'https://maven.aliyun.com/repository/google'}
-            maven { url 'https://jitpack.io' }
+            jcenter()
+            mavenCentral()
+            google()
         }
         /**
          * Gradle插件
@@ -92,7 +212,7 @@ buildscript {
         classpath "org.aspectj:aspectjtools:$aspectj_version"
     }
     repositories {
-        mavenCentral()
+        google()
     }
 }
 /**
@@ -100,13 +220,13 @@ buildscript {
  */
 allprojects {
     repositories {
-        maven { url 'https://maven.aliyun.com/repository/public' }
-        maven { url 'https://maven.aliyun.com/repository/google'}
-        maven { url 'https://jitpack.io' }
-    }
-    tasks.withType(Javadoc) { // 新增
-        options.addStringOption('Xdoclint:none', '-quiet')
-        options.addStringOption('encoding', 'UTF-8')
+        jcenter()
+        mavenCentral()
+        google()
+
+        maven { url 'https://dl.bintray.com/geamtear/maven' }
+        maven { url "https://jitpack.io" }
+
     }
 }
 
@@ -116,3 +236,5 @@ allprojects {
 task clean(type: Delete) {
     delete rootProject.buildDir
 }
+
+

+ 3 - 1
common/build.gradle

@@ -235,7 +235,9 @@ dependencies {
     /**
      * google
      */
-    compile 'com.google.guava:guava:23.0'
+    compile 'com.google.guava:guava:20.0'
+
+    compile 'org.greenrobot:eventbus:3.0.0'
 }
 
 //tasks.withType(JavaCompile) {

+ 11 - 0
common/src/main/code/com/wdkl/ncs/android/lib/base/BaseActivity.kt

@@ -15,6 +15,7 @@ import com.enation.javashop.utils.base.tool.BaseToolActivity
 import com.enation.javashop.utils.base.tool.CommonTool
 import com.enation.javashop.utils.base.widget.LoadingDialog
 import kotlinx.android.synthetic.main.custom_loading.view.*
+import org.greenrobot.eventbus.EventBus
 import java.lang.reflect.Field
 import javax.inject.Inject
 
@@ -111,6 +112,16 @@ abstract class BaseActivity<PresenterType : BaseContract.BasePresenter, DataBind
         lifeCycleDo(LIFE_CYCLE_PAUSE)
     }
 
+    override fun onStart() {
+        super.onStart()
+        EventBus.getDefault().register(this)
+    }
+
+
+    override fun onStop() {
+        super.onStop()
+        EventBus.getDefault().unregister(this)
+    }
     /**
      * @author  LDD
      * @From   com.wdkl.ncs.android.lib.base.BaseActivity

+ 1 - 0
common/src/main/code/com/wdkl/ncs/android/lib/core/framework/JavaShopInstrumentationHook.java

@@ -68,6 +68,7 @@ public class JavaShopInstrumentationHook extends Instrumentation {
                         contextThread, token, target, Framework.Companion.getClassNotFoundInterceptor().call(target,intent), requestCode, options);
             } catch (Exception e1) {
                 Log.e("StartActivityError",e1.getMessage());
+                Log.e("StartActivityError",e1.toString());
                 return null;
             }
         }

+ 2 - 0
gradle.properties

@@ -19,3 +19,5 @@ systemProp.http.proxyPort=80
 org.gradle.daemon=true
 org.gradle.parallel=true
 org.gradle.configureondemand=true
+android.useAndroidX=true
+android.enableJetifier=true

+ 2 - 0
home/build.gradle

@@ -110,6 +110,8 @@ dependencies {
      */
     compile 'com.android.support.constraint:constraint-layout:1.1.0-beta5'
     implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
+
+    compile project(':starRTC')
 }
 
 /**

+ 17 - 10
home/src/main/AndroidManifest.xml

@@ -1,17 +1,24 @@
 <manifest xmlns:android="http://schemas.android.com/apk/res/android"
 
-          package="com.wdkl.ncs.android.component.home"
->
+    package="com.wdkl.ncs.android.component.home">
 
-    <application android:allowBackup="true"
-                 android:label="@string/app_name"
-                 android:supportsRtl="true"
-    >
+    <application
+        android:allowBackup="true"
+        android:label="@string/app_name"
+        android:supportsRtl="true">
 
-    <activity android:name=".activity.HomeActivity"
-              android:launchMode="singleTask"
-        />
-        <activity android:name=".activity.WatchContractsActivity"/>
+        <activity
+            android:name=".activity.HomeActivity"
+            android:launchMode="singleTask" />
+        <activity android:name=".activity.WatchHomeActivity" />
+        <activity android:name=".activity.WatchContractsActivity" />
+        <activity android:name=".activity.WatchCallRecordsActivity" />
+
+        <service android:name="com.starrtc.demo.demo.service.KeepLiveService">
+            <intent-filter>
+                <action android:name="com.starrtc.demo.service.KeepLiveService" />
+            </intent-filter>
+        </service>
     </application>
 
 </manifest>

+ 146 - 0
home/src/main/code/com/wdkl/ncs/android/component/home/activity/WatchCallRecordsActivity.kt

@@ -0,0 +1,146 @@
+package com.wdkl.ncs.android.component.home.activity
+
+import android.content.Intent
+import android.graphics.Color
+import android.util.Log
+import com.alibaba.android.vlayout.DelegateAdapter
+import com.alibaba.android.vlayout.VirtualLayoutManager
+import com.enation.javashop.android.jrouter.external.annotation.Router
+import com.enation.javashop.net.engine.model.NetState
+import com.scwang.smartrefresh.layout.footer.ClassicsFooter
+import com.wdkl.ncs.android.component.home.R
+import com.wdkl.ncs.android.component.home.adapter.WatchCallRecordsItemAdapter
+import com.wdkl.ncs.android.component.home.databinding.WatchActivityCallRecordsBinding
+import com.wdkl.ncs.android.component.home.launch.HomeLaunch
+import com.wdkl.ncs.android.component.nursehome.common.Constants
+import com.wdkl.ncs.android.lib.base.BaseActivity
+import com.wdkl.ncs.android.lib.utils.AppTool
+import com.wdkl.ncs.android.middleware.logic.contract.home.WatchActivityContract
+import com.wdkl.ncs.android.middleware.logic.contract.home.WatchCallRecordsFragmentContract
+import com.wdkl.ncs.android.middleware.logic.presenter.home.WatchActivityPresenter
+import com.wdkl.ncs.android.middleware.logic.presenter.home.WatchCallRecordsFragmentPresenter
+import com.wdkl.ncs.android.middleware.model.vo.InteractionVO
+import com.wdkl.ncs.android.middleware.model.vo.WatchContactsVO
+import com.wdkl.ncs.android.middleware.tcp.dto.TcpModel
+import com.wdkl.ncs.android.middleware.utils.MessageEvent
+import kotlinx.android.synthetic.main.watch_activity_call_records.*
+import org.greenrobot.eventbus.Subscribe
+import org.greenrobot.eventbus.ThreadMode
+
+
+@Router(path = "/watch/callrecords")
+class WatchCallRecordsActivity : BaseActivity<WatchCallRecordsFragmentPresenter, WatchActivityCallRecordsBinding>(), WatchCallRecordsFragmentContract.View {
+
+
+    var TAG = WatchCallRecordsActivity::class.java.getSimpleName()
+
+    /**
+     * @Name  virtualLayoutManager
+     * @Type  VirtualLayoutManager
+     * @Note  VLayoutManager
+     */
+    private lateinit var virtualLayoutManager: VirtualLayoutManager
+
+    /**
+     * @Name  delegateAdapter
+     * @Type  DelegateAdapter
+     * @Note  七巧板适配器
+     */
+    private lateinit var delegateAdapter: DelegateAdapter
+
+    private val watchCallRecordsItemAdapter = WatchCallRecordsItemAdapter(ArrayList())
+
+    private var customerId = ""
+    private var ACTION = "ACTION"
+     var all = "ALL"
+     var initiator = "INITATOR"
+     var action: String? = null
+
+
+    override fun getLayId(): Int {
+        return R.layout.watch_activity_call_records
+    }
+
+    override fun bindDagger() {
+        HomeLaunch.component.inject(this)
+    }
+
+    override fun init() {
+        /**初始化LayoutMannager*/
+        virtualLayoutManager = VirtualLayoutManager(this.activity)
+
+        /**初始化适配器*/
+        delegateAdapter = DelegateAdapter(virtualLayoutManager)
+        delegateAdapter.addAdapter(watchCallRecordsItemAdapter)
+        mViewBinding.refresh.setRefreshFooter(ClassicsFooter(activity))
+
+        /**配置到RecycleView*/
+        call_records_recyv.layoutManager = virtualLayoutManager
+        call_records_recyv.adapter = delegateAdapter
+
+        action = intent.getStringExtra("action")
+        customerId = intent.getStringExtra("customer_id")
+        if (action == all) {
+            if (customerId.equals("")) {
+            presenter.loadFloor(all, 1,30, Constants.ids.toInt(),0)
+            }
+        }else {
+            presenter.loadFloor(initiator, 1, 30,Constants.ids.toInt(),customerId.toInt())
+        }
+    }
+
+    override fun bindEvent() {
+    }
+
+    override fun destory() {
+    }
+
+    override fun renderFloor(data: ArrayList<InteractionVO>) {
+        Log.e(TAG, "renderFloor() " + data.size)
+
+        refresh.finishRefresh()
+        if (data.size > 0) {
+            watchCallRecordsItemAdapter.data.clear()
+            watchCallRecordsItemAdapter.data.addAll(data)
+            watchCallRecordsItemAdapter.notifyDataSetChanged()
+        }
+        refresh.finishLoadMore()
+    }
+
+    /**
+     * 显示发起人的呼叫记录
+     */
+    override fun showInitiatorData(data: ArrayList<InteractionVO>) {
+        Log.e(TAG, "showInitiatorData() " + data.size)
+        refresh.finishRefresh()
+        if (data.size > 0) {
+            watchCallRecordsItemAdapter.data.clear()
+            watchCallRecordsItemAdapter.data.addAll(data)
+            watchCallRecordsItemAdapter.notifyDataSetChanged()
+        }
+        refresh.finishLoadMore()
+
+    }
+
+
+    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) {
+        var messageEvent = messageEvent.getMessage() as TcpModel
+//        if(messageEvent.getAction() === TcpAction.EventAction.KEY_CLICK){
+//            Log.e(TAG,"收到tcp消息")
+//        }
+    }
+
+}

+ 58 - 27
home/src/main/code/com/wdkl/ncs/android/component/home/activity/WatchContractsActivity.kt

@@ -1,5 +1,6 @@
 package com.wdkl.ncs.android.component.home.activity
 
+import android.content.Intent
 import android.util.Log
 import com.alibaba.android.vlayout.DelegateAdapter
 import com.alibaba.android.vlayout.VirtualLayoutManager
@@ -15,10 +16,30 @@ import com.wdkl.ncs.android.lib.utils.showMessage
 import com.wdkl.ncs.android.middleware.logic.contract.home.WatchActivityContract
 import com.wdkl.ncs.android.middleware.logic.presenter.home.WatchActivityPresenter
 import com.wdkl.ncs.android.middleware.model.vo.WatchContactsVO
+import com.wdkl.ncs.android.middleware.tcp.dto.TcpModel
+import com.wdkl.ncs.android.middleware.utils.MessageEvent
 import kotlinx.android.synthetic.main.watch_contacts_lay.*
+import org.greenrobot.eventbus.Subscribe
+import org.greenrobot.eventbus.ThreadMode
 
 @Router(path = "/watch/contacts")
 class WatchContractsActivity : BaseActivity<WatchActivityPresenter, WatchContactsLayBinding>(), WatchActivityContract.View {
+    var TAG = WatchContractsActivity::class.java.getSimpleName()
+
+    private var page: Int = 1
+    private val adapter = WatchContactsItemAdapter(ArrayList())
+
+    var deviceId: Int = 16
+
+    private lateinit var virtualLayoutManager: VirtualLayoutManager
+
+    private lateinit var delegateAdapter: DelegateAdapter
+
+
+    override fun getLayId(): Int {
+        return R.layout.watch_contacts_lay
+    }
+
     override fun bindDagger() {
         HomeLaunch.component.inject(this)
     }
@@ -45,19 +66,6 @@ class WatchContractsActivity : BaseActivity<WatchActivityPresenter, WatchContact
 
     }
 
-    private var page :Int = 1
-    private val adapter = WatchContactsItemAdapter(ArrayList())
-
-    override fun getLayId(): Int {
-        return R.layout.watch_contacts_lay
-    }
-
-    @JvmField var deviceId: Int = 16
-
-    private lateinit var virtualLayoutManager: VirtualLayoutManager
-
-    private lateinit var delegateAdapter: DelegateAdapter
-
     override fun init() {
         /**初始化LayoutMannager*/
         virtualLayoutManager = VirtualLayoutManager(this.activity)
@@ -69,42 +77,65 @@ class WatchContractsActivity : BaseActivity<WatchActivityPresenter, WatchContact
         /**配置到RecycleView*/
         watch_contacts_list.layoutManager = virtualLayoutManager
         watch_contacts_list.adapter = delegateAdapter
-        presenter.loadData(deviceId,page)
+        presenter.loadData(page, deviceId)
     }
 
     override fun bindEvent() {
         refresh.setOnLoadMoreListener {
             page += 1
-            presenter.loadData(deviceId,page)
+            presenter.loadData(page, deviceId)
         }
-        refresh.setOnRefreshListener{
-            presenter.loadData(deviceId,1)
+        refresh.setOnRefreshListener {
+            presenter.loadData(1, deviceId)
+        }
+
+        adapter.setOnItemLongClickListener { data, position ->
+            //todo 临时写的测试语音通话功能
+
+
+
+
+            var customerId = data.customerId
+            if(data.customerId == null){
+                customerId = 0
+            }
+            var intent = Intent(this, WatchCallRecordsActivity::class.java)
+            intent.putExtra("action", "INITATOR")
+            intent.putExtra("customer_id", ""+customerId)
+            startActivity(intent)
+
         }
-//        adapter.setOnItemClickListener { data, _ ->
-//            push("/shop/detail",{postcard ->
-//                postcard.withInt("shopId", data.shopId)
-//            })
-//        }
     }
 
     override fun render(data: ArrayList<WatchContactsVO>) {
-        if (page == 1){
+
+        Log.e(TAG,"返回的数据 "+data)
+        refresh.finishRefresh()
+        if (page == 1) {
             refresh.resetNoMoreData()
-            if (data.size >0){
+            if (data.size > 0) {
                 adapter.data.clear()
                 adapter.data.addAll(data)
-                Log.i("abc1"," " + data.size);
+                Log.i("abc1", " " + data.size);
                 adapter.notifyDataSetChanged()
             }
             refresh.finishLoadMore()
-        }else {
+        } else {
             if (data.size > 0) {
                 adapter.data.addAll(data)
                 adapter.notifyDataSetChanged()
                 refresh.finishLoadMore()
-            }else{
+            } else {
                 refresh.finishLoadMoreWithNoMoreData()
             }
         }
     }
+
+    @Subscribe(threadMode = ThreadMode.MAIN)
+    fun onMoonEvent(messageEvent: MessageEvent) {
+        var messageEvent = messageEvent.getMessage() as TcpModel
+//        if(messageEvent.getAction() === TcpAction.EventAction.KEY_CLICK){
+//            Log.e(TAG,"收到tcp消息")
+//        }
+    }
 }

+ 102 - 0
home/src/main/code/com/wdkl/ncs/android/component/home/activity/WatchHomeActivity.kt

@@ -0,0 +1,102 @@
+package com.wdkl.ncs.android.component.home.activity
+
+import android.content.Intent
+import android.graphics.Color
+import android.view.View
+import com.enation.javashop.android.jrouter.external.annotation.Router
+import com.enation.javashop.net.engine.model.NetState
+import com.wdkl.ncs.android.component.home.R
+import com.wdkl.ncs.android.component.home.databinding.WatchActivityHomeBinding
+import com.wdkl.ncs.android.component.home.launch.HomeLaunch
+import com.wdkl.ncs.android.lib.base.BaseActivity
+import com.wdkl.ncs.android.lib.utils.AppTool
+import com.wdkl.ncs.android.lib.utils.push
+import com.wdkl.ncs.android.lib.utils.showMessage
+import com.wdkl.ncs.android.middleware.logic.contract.home.WatchHomeActivityContract
+import com.wdkl.ncs.android.middleware.logic.presenter.home.WatchHomeActivityPresenter
+import com.wdkl.ncs.android.middleware.tcp.dto.TcpModel
+import com.wdkl.ncs.android.middleware.utils.MessageEvent
+import kotlinx.android.synthetic.main.watch_activity_home.*
+import org.greenrobot.eventbus.Subscribe
+import org.greenrobot.eventbus.ThreadMode
+
+@Router(path = "/watch/home")
+class WatchHomeActivity : BaseActivity<WatchHomeActivityPresenter, WatchActivityHomeBinding>(), WatchHomeActivityContract.View, View.OnClickListener {
+    var TAG = WatchHomeActivity::class.java.getSimpleName()
+
+    override fun getLayId(): Int {
+        return R.layout.watch_activity_home
+    }
+
+    override fun bindDagger() {
+        HomeLaunch.component.inject(this)
+    }
+
+    override fun init() {
+        AppTool.SystemUI.showNavigationBar(this,false)
+        AppTool.SystemUI.ImmersiveWithBottomBarColor(this, Color.BLACK)
+
+
+
+    }
+
+    override fun bindEvent() {
+        customer_list_linlyout.setOnClickListener(this)
+        call_records_linlyout.setOnClickListener(this)
+        user_nume_linlyout.setOnClickListener(this)
+        state_linlyout.setOnClickListener(this)
+
+    }
+
+    override fun destory() {
+    }
+
+    override fun render() {
+    }
+
+    override fun onError(message: String, type: Int) {
+    }
+
+    override fun complete(message: String, type: Int) {
+    }
+
+    override fun start() {
+    }
+
+    override fun networkMonitor(state: NetState) {
+    }
+
+    /**
+     * 监听
+     */
+    override fun onClick(p0: View) {
+        when(p0.id){
+            R.id.customer_list_linlyout ->{
+                push("/watch/contacts")
+
+            }
+            R.id.call_records_linlyout ->{
+//                push("/watch/callrecords")
+                var intent = Intent(this, WatchCallRecordsActivity::class.java)
+                intent.putExtra("action", "ALL")
+                intent.putExtra("customer_id", "")
+                startActivity(intent)
+            }
+            R.id.user_nume_linlyout ->{
+            }
+            R.id.state_linlyout ->{
+
+            }
+
+
+        }
+    }
+
+    @Subscribe(threadMode = ThreadMode.MAIN)
+    fun onMoonEvent(messageEvent: MessageEvent) {
+        var messageEvent = messageEvent.getMessage() as TcpModel
+//        if(messageEvent.getAction() === TcpAction.EventAction.KEY_CLICK){
+//            Log.e(TAG,"收到tcp消息")
+//        }
+    }
+}

+ 105 - 0
home/src/main/code/com/wdkl/ncs/android/component/home/activity/WatchRegisterActivity.kt

@@ -0,0 +1,105 @@
+package com.wdkl.ncs.android.component.home.activity
+
+import android.content.Intent
+import android.os.Handler
+import android.util.Log
+import com.enation.javashop.android.jrouter.external.annotation.Router
+import com.enation.javashop.net.engine.model.NetState
+import com.starrtc.demo.demo.service.KeepLiveService
+import com.starrtc.demo.utils.AEvent
+import com.wdkl.ncs.android.component.home.R
+import com.wdkl.ncs.android.component.home.databinding.WatchActivityRegisterBinding
+import com.wdkl.ncs.android.component.home.databinding.WatchContactsLayBinding
+import com.wdkl.ncs.android.component.home.launch.HomeLaunch
+import com.wdkl.ncs.android.component.home.util.NetHelper
+import com.wdkl.ncs.android.component.nursehome.common.Constants
+import com.wdkl.ncs.android.lib.base.BaseActivity
+import com.wdkl.ncs.android.lib.utils.AppTool
+import com.wdkl.ncs.android.lib.utils.push
+import com.wdkl.ncs.android.middleware.logic.contract.home.WatchActivityContract
+import com.wdkl.ncs.android.middleware.logic.contract.home.WatchDeviceContract
+import com.wdkl.ncs.android.middleware.logic.presenter.home.WatchActivityPresenter
+import com.wdkl.ncs.android.middleware.logic.presenter.home.WatchDevicePresenter
+import com.wdkl.ncs.android.middleware.model.dos.DeviceDO
+import com.wdkl.ncs.android.middleware.model.vo.WatchContactsVO
+import com.wdkl.ncs.android.middleware.tcp.dto.TcpModel
+import com.wdkl.ncs.android.middleware.utils.MessageEvent
+import org.greenrobot.eventbus.Subscribe
+import org.greenrobot.eventbus.ThreadMode
+
+@Router(path = "/home/watchRegister")
+class WatchRegisterActivity: BaseActivity<WatchDevicePresenter, WatchActivityRegisterBinding>(), WatchDeviceContract.View  {
+    var TAG = WatchRegisterActivity::class.java.getSimpleName()
+
+    override fun getLayId(): Int {
+        return R.layout.watch_activity_register
+    }
+
+    override fun bindDagger() {
+        HomeLaunch.component.inject(this)
+    }
+
+    override fun init() {
+        Constants.mac = NetHelper.getInstance().macAddress
+        Log.e(TAG,"mac "+Constants.mac)
+        presenter.loadData(Constants.mac)
+
+
+
+    }
+
+    override fun bindEvent() {
+    }
+
+    override fun destory() {
+    }
+
+    override fun showData(data: DeviceDO) {
+        Log.e(TAG,"收到返回的设备信息 ")
+        Constants.ids = ""+data.id
+        Constants.sip_id =data.sipId
+        //这里的是视频通话有关的
+        AEvent.setHandler(Handler())
+        //这里的是视频通话有关的
+
+//        initSDK("000100")
+        initSDK(data.sipId)
+        AppTool.Time.delay(300) {
+            push("/watch/home")
+            finish()
+        }
+
+    }
+
+    private fun initSDK(DeviceSipId: String) {
+        val intent = Intent(this, KeepLiveService::class.java)
+        intent.putExtra("DeviceSipId", DeviceSipId)
+        startService(intent)
+
+//        val intent2 = Intent(this, RTCKeepLiveService::class.java)
+//        startService(intent2)
+    }
+    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) {
+        var messageEvent = messageEvent.getMessage() as TcpModel
+//        if(messageEvent.getAction() === TcpAction.EventAction.KEY_CLICK){
+//            Log.e(TAG,"收到tcp消息")
+//        }
+    }
+}

+ 256 - 0
home/src/main/code/com/wdkl/ncs/android/component/home/adapter/WatchCallRecordsItemAdapter.kt

@@ -0,0 +1,256 @@
+package com.wdkl.ncs.android.component.home.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.home.R
+import com.wdkl.ncs.android.component.home.databinding.AdapterWatchCallRecordsItemBinding
+import com.wdkl.ncs.android.component.nursehome.common.Constants
+import com.wdkl.ncs.android.component.nursehome.util.MediaPlayer
+import com.wdkl.ncs.android.component.nursehome.util.TimeTransition
+import com.wdkl.ncs.android.lib.adapter.BaseDelegateAdapter
+import com.wdkl.ncs.android.lib.utils.BaseRecyclerViewHolder
+import com.wdkl.ncs.android.lib.utils.showMessage
+import com.wdkl.ncs.android.middleware.model.vo.InteractionVO
+import com.wdkl.ncs.android.middleware.tcp.TcpClient
+import com.wdkl.ncs.android.middleware.tcp.channel.EventUtil
+import com.wdkl.ncs.android.middleware.tcp.channel.ImUtil
+import com.wdkl.ncs.android.middleware.tcp.enums.TcpType
+
+/**
+ * 呼叫记录适配器
+ */
+class WatchCallRecordsItemAdapter(val data: ArrayList<InteractionVO>) : BaseDelegateAdapter<BaseRecyclerViewHolder<AdapterWatchCallRecordsItemBinding>, InteractionVO>() {
+    var TAG = WatchCallRecordsItemAdapter::class.java.getSimpleName()
+
+    /**
+     * 数据提供者
+     */
+    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 {
+        Log.i("abc", data.toString());
+        return LinearLayoutHelper(0, data.size)
+    }
+
+    /**
+     * 创建ViewHolder
+     */
+    override fun onCreateViewHolder(parent: ViewGroup?, viewType: Int): BaseRecyclerViewHolder<AdapterWatchCallRecordsItemBinding> {
+        return BaseRecyclerViewHolder.build(parent, R.layout.adapter_watch_call_records_item)
+    }
+
+    /**
+     * 绑定数据
+     */
+    override fun onBindViewHolder(holder: BaseRecyclerViewHolder<AdapterWatchCallRecordsItemBinding>?, position: Int) {
+        holder?.bind { binding ->
+            val itemData = getItem(position)
+
+            if (itemData.createDate != null) {
+                binding.callTimeTv.text = TimeTransition().stampToDate(itemData.createDate*1000)
+            }
+
+
+//            //事件类型
+//            if (itemData.actionType == TcpType.EVENT.name) {
+//                //事件
+//                binding.playTv.visibility = View.GONE
+//                binding.projectTv.visibility = View.VISIBLE
+//
+//                //语音留言
+//            } else if (itemData.actionType.equals("IM")) {
+//
+//                binding.projectTv.visibility = View.GONE
+//                binding.playTv.visibility = View.VISIBLE
+//
+//                //语音呼叫
+//            } else if (itemData.actionType.equals("VOICE")) {
+//
+//
+//                //视频呼叫
+//            } else if (itemData.actionType.equals("VIDEO")) {
+//
+//
+//            }
+            //是否已播放 已响应
+            if (itemData.actionEnd != null) {
+                Log.e(TAG, "" + itemData.actionEnd+" "+position)
+                Log.e(TAG, "" + itemData.actionType+" "+position)
+                Log.e(TAG, "" + itemData.data+" "+position)
+
+                Log.e(TAG, "" + itemData.actionType+" "+position)
+                Log.e(TAG, "" + TcpType.IM.name+" "+position)
+
+                binding.treatmentStateImagev.setImageResource(R.drawable.yi_chu_li)
+//                binding.callStatusImagev.setImageResource(R.drawable.yi_jie)
+                binding.treatmentStateImagev.visibility = View.VISIBLE
+                binding.processingTimeTv.visibility = View.VISIBLE
+
+                //判断是呼入还是呼出 1 分机到主机 2主机到分机
+                if(itemData.actionDirectionType == 1){
+                    binding.sickbedTv.text = itemData.fromFrameFullName
+                    binding.nameTv.text = itemData.fromMemberName
+                    //TODO 图标显示不正常 暂时没放完整图标
+                    binding.callStatusImagev.setImageResource(R.drawable.hu_ru_yi_jie)
+                }else if(itemData.actionDirectionType == 2 || itemData.actionDirectionType == 3){
+                    binding.sickbedTv.text = itemData.toFrameFullName
+                    binding.nameTv.text = itemData.toMemberName
+                    binding.callStatusImagev.setImageResource(R.drawable.hu_chu_yi_jie)
+                }
+
+                if(itemData.actionType == TcpType.EVENT.name){//事件已经响应 相应的数据
+                    binding.playTv.visibility = View.GONE
+                    binding.projectTv.visibility = View.VISIBLE
+                    binding.conductorNameTv.visibility = View.VISIBLE
+                    binding.projectTv.text = itemData.data
+                    binding.conductorNameTv.text = itemData.toMemberName
+                    binding.processingTimeTv.text = TimeTransition().stampToDate(itemData.actionEnd*1000)
+                    binding.projectTv.setBackgroundResource(R.drawable.sp_event_handled)
+                }else if (itemData.actionType == TcpType.IM.name){//语音已播放
+
+                    binding.projectTv.visibility = View.GONE
+                    binding.playTv.visibility = View.VISIBLE
+                    binding.conductorNameTv.visibility = View.GONE
+                    binding.playTv.setBackgroundResource(R.drawable.yi_bo_fang)
+                    binding.processingTimeTv.text = "已播放"
+
+                }else if(itemData.actionType == TcpType.VOICE.name){ //语音呼叫已接听
+                    binding.projectTv.visibility = View.GONE
+                    binding.playTv.visibility = View.VISIBLE
+                    binding.treatmentStateImagev.visibility = View.GONE
+                    binding.processingTimeTv.visibility = View.GONE
+
+                }else if(itemData.actionType == TcpType.VIDEO.name){ //视频呼叫已接听
+
+                    binding.projectTv.visibility = View.GONE
+                    binding.playTv.visibility = View.VISIBLE
+                    binding.treatmentStateImagev.visibility = View.GONE
+                    binding.processingTimeTv.visibility = View.GONE
+                }
+
+            } else {
+                Log.e(TAG, "" + itemData.actionEnd+" "+position)
+                Log.e(TAG, "" + itemData.actionType+" "+position)
+                Log.e(TAG, "" + itemData.data+" "+position)
+                Log.e(TAG, "" + itemData.actionDirectionType+" "+position)
+                //判断是呼入还是呼出 1 分机到主机 2主机到分机
+                if(itemData.actionDirectionType == 1){
+                    Log.e(TAG, "进入。。。。" )
+                    binding.sickbedTv.text = itemData.fromFrameFullName
+                    binding.nameTv.text = itemData.fromMemberName
+                    // 图标显示不正常 暂时没放完整图标
+                    binding.callStatusImagev.setImageResource(R.drawable.hu_ru_wei_jie)
+                }else if(itemData.actionDirectionType == 2 || itemData.actionDirectionType == 3){
+                    binding.sickbedTv.text = itemData.toFrameFullName
+                    binding.nameTv.text = itemData.toMemberName
+                    binding.callStatusImagev.setImageResource(R.drawable.hu_chu_wei_jie)
+                }
+
+                binding.treatmentStateImagev.setImageResource(R.drawable.wei_chu_li)
+//                binding.callStatusImagev.setImageResource(R.drawable.wei_jie)
+                binding.conductorNameTv.visibility = View.GONE
+                binding.treatmentStateImagev.visibility = View.VISIBLE
+                binding.processingTimeTv.visibility = View.VISIBLE
+                if(itemData.actionType == TcpType.EVENT.name){//事件未处理
+                    binding.playTv.visibility = View.GONE
+                    binding.projectTv.visibility = View.VISIBLE
+                    binding.projectTv.text = itemData.data
+                    binding.projectTv.setBackgroundResource(R.drawable.sp_event_unhandled_bg)
+                    binding.processingTimeTv.text = "未处理"
+                }else if (itemData.actionType == TcpType.IM.name){//语音未播放
+                    binding.projectTv.visibility = View.GONE
+                    binding.playTv.visibility = View.VISIBLE
+                    binding.playTv.setBackgroundResource(R.drawable.wei_bo_fang)
+                    binding.processingTimeTv.text = "未播放"
+                }else if(itemData.actionType == TcpType.VOICE.name){ //语音呼叫未接听
+                    binding.projectTv.visibility = View.GONE
+                    binding.playTv.visibility = View.GONE
+                    binding.treatmentStateImagev.visibility = View.GONE
+                    binding.processingTimeTv.visibility = View.GONE
+                }else if(itemData.actionType == TcpType.VIDEO.name){ //视频呼叫未接听
+                    binding.projectTv.visibility = View.GONE
+                    binding.playTv.visibility = View.GONE
+                    binding.treatmentStateImagev.visibility = View.GONE
+                    binding.processingTimeTv.visibility = View.GONE
+
+                }
+            }
+
+
+            binding.projectTv.setOnClickListener {
+                //事件处理监听
+//                    点击之后发送通知
+//                    showMessage("点击了事件按钮")
+                if (itemData.actionEnd != null)return@setOnClickListener
+                Log.e(TAG, "点击了事件按钮")
+
+                Thread(Runnable {
+                    run {
+                        Log.e(TAG, "aaassss "+ Constants.ids +"kong")
+
+                        if (!Constants.ids.equals("")) {
+                            var eventTcpModel = EventUtil.eventResponse(Constants.ids.toInt(), itemData.fromDeviceId, itemData.id)
+//                        val map = HashMap<String,Int>()
+//                        map.put("id",1)
+//                        eventTcpModel.setData(map)
+                            TcpClient.getInstance().sendMsg(eventTcpModel.toJson())
+                        } else {
+                            showMessage("获取不到当给前设备id")
+                        }
+                    }
+                }).start()
+
+                //处理完之后要刷新数据
+            }
+            binding.playTv.setOnClickListener {
+                if (itemData.actionEnd != null)return@setOnClickListener
+                //点击之后播放语音留言
+                showMessage("点击了播放留言")
+                Thread(Runnable {
+                    run {
+                        if (!Constants.ids.equals("")) {
+                            var imUtilTcpModel = ImUtil.imRead(Constants.ids.toInt(), itemData.fromDeviceId, itemData.id)
+
+//                val map = HashMap<String,Int>()
+//                map.put("id",1)
+//                imUtilTcpModel.setData(map)
+                            TcpClient.getInstance().sendMsg(imUtilTcpModel.toJson())
+                            var mediaPlayer = MediaPlayer()
+                            mediaPlayer.startMediaPlayer("http://192.168.1.112:8006"+itemData.data)
+                            mediaPlayer.setVolume(0.3f)
+
+                        } else {
+                            showMessage("获取不到当给前设备id")
+                        }
+                    }
+                }).start()
+
+                //处理完之后要刷新数据
+            }
+
+        }
+    }
+
+}

+ 8 - 10
home/src/main/code/com/wdkl/ncs/android/component/home/adapter/WatchContactsItemAdapter.kt

@@ -5,14 +5,12 @@ import android.view.ViewGroup
 import com.alibaba.android.vlayout.LayoutHelper
 import com.alibaba.android.vlayout.layout.LinearLayoutHelper
 import com.wdkl.ncs.android.component.home.R
-import com.wdkl.ncs.android.component.home.databinding.WatchContactsItemBinding
+import com.wdkl.ncs.android.component.home.databinding.AdapterWatchContactsItemBinding
 import com.wdkl.ncs.android.lib.adapter.BaseDelegateAdapter
 import com.wdkl.ncs.android.lib.utils.BaseRecyclerViewHolder
 import com.wdkl.ncs.android.middleware.model.vo.WatchContactsVO
-import kotlinx.android.synthetic.main.floor_item_text_lay.view.*
-import kotlinx.android.synthetic.main.watch_contacts_item.view.*
 
-class WatchContactsItemAdapter(val data:ArrayList<WatchContactsVO>) : BaseDelegateAdapter<BaseRecyclerViewHolder<WatchContactsItemBinding>, WatchContactsVO>(){
+class WatchContactsItemAdapter(val data:ArrayList<WatchContactsVO>) : BaseDelegateAdapter<BaseRecyclerViewHolder<AdapterWatchContactsItemBinding>, WatchContactsVO>(){
     override fun dataProvider(): Any {
         return data
     }
@@ -26,20 +24,20 @@ class WatchContactsItemAdapter(val data:ArrayList<WatchContactsVO>) : BaseDelega
     }
 
     override fun onCreateLayoutHelper(): LayoutHelper {
-        Log.i("abc",data.toString());
+        Log.i("abc",data.toString())
         return LinearLayoutHelper(0,data.size)
     }
 
-    override fun onCreateViewHolder(parent: ViewGroup?, viewType: Int): BaseRecyclerViewHolder<WatchContactsItemBinding> {
-        return BaseRecyclerViewHolder.build(parent, R.layout.watch_contacts_item)
+    override fun onCreateViewHolder(parent: ViewGroup?, viewType: Int): BaseRecyclerViewHolder<AdapterWatchContactsItemBinding> {
+        return BaseRecyclerViewHolder.build(parent, R.layout.adapter_watch_contacts_item)
     }
 
-    override fun onBindViewHolder(holder: BaseRecyclerViewHolder<WatchContactsItemBinding>?, position: Int) {
+    override fun onBindViewHolder(holder: BaseRecyclerViewHolder<AdapterWatchContactsItemBinding>?, position: Int) {
         holder?.bind {
             binding ->
             val itemData = getItem(position)
-            binding.watchContactsItemRoomName.text = itemData.fullName
-            binding.watchContactsItemCustomerName.text = itemData.named
+            binding.roomNumberTv.text = itemData.frameFullName
+            binding.nameTv.text = itemData.customerNamed
         }
     }
 }

+ 13 - 0
home/src/main/code/com/wdkl/ncs/android/component/home/common/Constants.kt

@@ -0,0 +1,13 @@
+//package com.wdkl.ncs.android.component.nursehome.common
+//
+//class Constants {
+//    companion object {
+//        var frame_id: String =""//医院结构ID
+//        var eth_ip: String ="" //当前设备的IP
+//        var ids: String =""//当前设备的ID
+//        var sip_id: String =""//sip
+//
+//    }
+//
+//
+//}

+ 9 - 2
home/src/main/code/com/wdkl/ncs/android/component/home/di/HomeComponent.kt

@@ -1,7 +1,6 @@
 package com.wdkl.ncs.android.component.home.di
 
-import com.wdkl.ncs.android.component.home.activity.HomeActivity
-import com.wdkl.ncs.android.component.home.activity.WatchContractsActivity
+import com.wdkl.ncs.android.component.home.activity.*
 import com.wdkl.ncs.android.component.home.fragment.CategoryFragment
 import com.wdkl.ncs.android.component.home.fragment.HomeFragment
 import com.wdkl.ncs.android.middleware.di.ApplicationComponent
@@ -22,5 +21,13 @@ interface HomeComponent {
 
     fun inject(activity: CategoryFragment)
 
+    //手表
+    fun inject(activity: WatchHomeActivity)
+
     fun inject(activity: WatchContractsActivity)
+
+    fun inject(activity: WatchCallRecordsActivity)
+
+    fun inject(activity: WatchRegisterActivity)
+
 }

+ 1 - 1
home/src/main/code/com/wdkl/ncs/android/component/home/fragment/HomeFragment.kt

@@ -217,7 +217,7 @@ class HomeFragment : BaseFragment<HomeFragmentPresenter,HomeFragLayBinding>(),Ho
 
     override fun pointMall() {
 //        push("/promotion/pointshop/main")
-        push("/watch/contacts")
+//        push("/watch/contacts")
     }
 
     override fun secKill() {

+ 115 - 0
home/src/main/code/com/wdkl/ncs/android/component/home/util/MediaPlayer.kt

@@ -0,0 +1,115 @@
+package com.wdkl.ncs.android.component.nursehome.util
+
+import android.media.AudioManager
+import android.media.MediaPlayer
+import android.util.Log
+import com.umeng.weixin.umengwx.e
+import java.io.IOException
+import java.lang.IllegalStateException
+
+class MediaPlayer {
+    private val TAG = MediaPlayer::class.java.getSimpleName()
+
+    var mMediaPlayer: MediaPlayer? = null
+
+    init {
+        Log.e(TAG, "初始化播放器")
+        mMediaPlayer = MediaPlayer()
+        //这样设置 不能控制本音乐的音量大小 也就是setVolume无效
+//        mMediaPlayer!!.setAudioStreamType(AudioManager.STREAM_MUSIC)
+        mMediaPlayer!!.setAudioStreamType(AudioManager.STREAM_VOICE_CALL)
+        mMediaPlayer!!.setOnCompletionListener {
+            Log.e(TAG, "播放完成")
+        }
+
+        mMediaPlayer!!.setOnPreparedListener {
+            Log.e(TAG, "加载完长")
+            mMediaPlayer!!.start()
+        }
+        mMediaPlayer!!.setOnErrorListener { mp, what, extra ->
+            Log.e(TAG, "异常")
+            false
+        }
+
+    }
+
+    //启动播放
+    fun startMediaPlayer(url: String) {
+        if ((mMediaPlayer != null && mMediaPlayer!!.isPlaying())) {
+            mMediaPlayer!!.stop()
+        }
+        mMediaPlayer!!.reset()
+        //设置音频文件到MediaPlayer对象中
+        //测试地址 "http://file.kuyinyun.com/group1/M00/90/B7/rBBGdFPXJNeAM-nhABeMElAM6bY151.mp3"
+        try {
+            mMediaPlayer!!.setDataSource(url)
+            //让MediaPlayer对象准备,用这个方法防止加载时耗时导致anr
+            mMediaPlayer!!.prepareAsync()
+        } catch (e: IOException) {
+            e.printStackTrace()
+            Log.e(TAG, "播放异常")
+        }catch (e:IllegalStateException) {
+            e.message
+            Log.e(TAG, "IllegalStateException+播放异常");
+        }
+
+    }
+
+    /**
+     * 暂停播放
+     */
+    fun pauseMediaPlayer() {
+        if (mMediaPlayer != null) {
+            mMediaPlayer!!.pause()
+        }
+
+    }
+
+    /**
+     * 继续播放
+     */
+    fun continueToPlayMediaPlayer() {
+        if (mMediaPlayer != null) {
+            mMediaPlayer!!.start()
+        }
+
+    }
+
+    /**
+     * 停止播放
+     */
+    fun stopMediaPlayer() {
+        if (mMediaPlayer != null) {
+            mMediaPlayer!!.stop()
+        }
+    }
+
+    /**
+     * 释放播放器资源
+     */
+    fun releaseMediaPlayer() {
+        if (mMediaPlayer != null) {
+            try {
+                mMediaPlayer!!.stop()
+                mMediaPlayer!!.release()
+            } catch (e: IllegalStateException) {
+
+            }
+
+        }
+        mMediaPlayer = null
+    }
+
+    /**
+     * 音量设置
+     *setDataSource()方法之后设置才有效
+     * @param volume
+     */
+    fun setVolume(volume: Float) {
+        if (mMediaPlayer != null) {
+            mMediaPlayer!!.setVolume(volume, volume)
+        }
+    }
+
+
+}

+ 454 - 0
home/src/main/code/com/wdkl/ncs/android/component/home/util/NetHelper.java

@@ -0,0 +1,454 @@
+package com.wdkl.ncs.android.component.home.util;
+
+import android.annotation.SuppressLint;
+import android.content.Context;
+import android.net.ConnectivityManager;
+import android.net.wifi.WifiInfo;
+import android.net.wifi.WifiManager;
+import android.text.TextUtils;
+
+import com.wdkl.ncs.android.lib.base.BaseApplication;
+
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.InputStreamReader;
+import java.net.InetAddress;
+import java.net.NetworkInterface;
+import java.net.SocketException;
+import java.util.Collections;
+import java.util.Enumeration;
+import java.util.List;
+import java.util.Timer;
+import java.util.TimerTask;
+
+
+public class NetHelper {
+    private WifiManager wifiManager;
+    private ConnectivityManager connManager;
+    private static NetHelper sInstance = null;
+
+    private static Timer timerNetStatus = null;
+    private static final int SCHEDULE_TIME = 30000;
+    public static boolean NetConn = false;
+
+    /**
+     * 以太网是否ping成功
+     */
+    public static final String ETHERNETSTATUS = "ethernetStatus";
+
+    public NetHelper() {
+    }
+
+    public static NetHelper getInstance() {
+        if (sInstance == null) {
+            synchronized (NetHelper.class) {
+                if (sInstance == null) {
+                    sInstance = new NetHelper();
+                }
+            }
+        }
+        return sInstance;
+    }
+
+    public void init() {
+        wifiManager = (WifiManager) BaseApplication.appContext.getApplicationContext().getSystemService(Context.WIFI_SERVICE);
+        connManager = (ConnectivityManager) BaseApplication.appContext.getApplicationContext().getSystemService(Context.CONNECTIVITY_SERVICE);
+    }
+
+    public static void startNetCheck() {
+        if (timerNetStatus != null) {
+            timerNetStatus.purge();
+        }
+        timerNetStatus = new Timer();
+        timerNetStatus.schedule(new TimerTask() {
+            @Override
+            public void run() {
+                NetConn = ping(getLocalElement(3), 2, null);
+
+//                EventBus.getDefault().post(new MessageEvent(ETHERNETSTATUS, EVENT_INTERNETPING));//循环检测SIP,以太网ping状态
+            }
+        }, 10, SCHEDULE_TIME);
+    }
+
+    /**
+     * ping 网络
+     *
+     * @param host
+     * @param pingCount
+     * @param stringBuffer
+     * @return
+     */
+    public static boolean ping(String host, int pingCount, StringBuffer stringBuffer) {
+        String line = null;
+        Process process = null;
+        BufferedReader successReader = null;
+        String command = "ping -c " + pingCount + " " + host;
+        boolean isSuccess = false;
+        try {
+            process = Runtime.getRuntime().exec(command);
+            if (process == null) {
+                append(stringBuffer, "ping fail:process is null.");
+                return false;
+            }
+            successReader = new BufferedReader(new InputStreamReader(process.getInputStream()));
+            while ((line = successReader.readLine()) != null) {
+                append(stringBuffer, line);
+            }
+            int status = process.waitFor();
+            if (status == 0) {
+                append(stringBuffer, "exec cmd success:" + command);
+                isSuccess = true;
+            } else {
+                append(stringBuffer, "exec cmd fail.");
+                isSuccess = false;
+            }
+            append(stringBuffer, "exec finished.");
+        } catch (IOException e) {
+        } catch (InterruptedException e) {
+        } finally {
+            if (process != null) {
+                process.destroy();
+            }
+            if (successReader != null) {
+                try {
+                    successReader.close();
+                } catch (IOException e) {
+                }
+            }
+        }
+
+        return isSuccess;
+    }
+
+    private static void append(StringBuffer stringBuffer, String text) {
+        if (stringBuffer != null) {
+            stringBuffer.append(text + "\n");
+        }
+    }
+
+    /**
+     * 获取网关  Waderson
+     * <p>
+     * 1 WIFI情况下获取网关 2 有线网络下的DHCP模式连接 3 有线网络其他连接方式:比如静态ip、pppoe拨号、ipoe拨号等
+     */
+    public static String getLocalElement(int type) {
+        String e = "";
+        if (1 == type) {
+            //e = getLocalElementByWifi();
+        } else if (2 == type) {
+            e = getLocalElementByDhcp();
+        } else if (3 == type) {
+            e = getLocalElementByIp();
+        }
+        if (!TextUtils.isEmpty(e) && e.length() >= 11 && e.length() <= 15) {
+            return e;
+        } else {
+            return "192.168.101.1";
+        }
+    }
+
+
+    /**
+     * 有线网络下的DHCP模式连接
+     */
+    public static String getLocalElementByDhcp() {
+        BufferedReader bufferedReader = null;
+        String str2 = "";
+        String str3 = "getprop dhcp.eth0.gateway";
+        Process exec;
+        BufferedReader bufferedReader2 = null;
+        try {
+            exec = Runtime.getRuntime().exec(str3);
+            try {
+                bufferedReader2 = new BufferedReader(new InputStreamReader(exec.getInputStream()));
+            } catch (Throwable th3) {
+                if (bufferedReader != null) {
+                    bufferedReader.close();
+                }
+                if (exec != null) {
+                    exec.exitValue();
+                }
+            }
+            try {
+                str3 = bufferedReader2.readLine();
+                if (str3 != null) {
+                    TextUtils.isEmpty(str3);
+                }
+                try {
+                    bufferedReader2.close();
+                } catch (IOException iOException222) {
+                    iOException222.printStackTrace();
+                }
+                if (exec != null) {
+                    try {
+                        exec.exitValue();
+                    } catch (Exception e5) {
+                    }
+                }
+            } catch (IOException e6) {
+                str3 = str2;
+                if (bufferedReader2 != null) {
+                    bufferedReader2.close();
+                }
+                if (exec != null) {
+                    exec.exitValue();
+                }
+                return str3;
+            }
+        } catch (IOException e62) {
+            bufferedReader2 = null;
+            exec = null;
+            str3 = str2;
+            if (bufferedReader2 != null) {
+                try {
+                    bufferedReader2.close();
+                } catch (IOException e) {
+                    e.printStackTrace();
+                }
+            }
+            if (exec != null) {
+                exec.exitValue();
+            }
+            return str3;
+        } catch (Throwable th4) {
+            exec = null;
+            if (bufferedReader != null) {
+                try {
+                    bufferedReader.close();
+                } catch (IOException e) {
+                    e.printStackTrace();
+                }
+            }
+            if (exec != null) {
+                exec.exitValue();
+            }
+        }
+        return str3;
+    }
+
+    /**
+     * 有线网络其他连接方式:比如静态ip、pppoe拨号、ipoe拨号等
+     */
+    public static String getLocalElementByIp() {
+        BufferedReader bufferedReader = null;
+        String result = "";
+        String str2 = "";
+        String str3 = "ip route list table 0";
+        Process exec;
+        BufferedReader bufferedReader2 = null;
+        try {
+            exec = Runtime.getRuntime().exec(str3);
+            try {
+                bufferedReader2 = new BufferedReader(new InputStreamReader(exec.getInputStream()));
+            } catch (Throwable th3) {
+                if (bufferedReader != null) {
+                    bufferedReader.close();
+                }
+                if (exec != null) {
+                    exec.exitValue();
+                }
+            }
+            try {
+                str2 = bufferedReader2.readLine();
+                if (str2 != null) {
+                    str2 = str2.trim();
+                    String[] strings = str2.split("\\s+");
+                    if (strings.length > 3) {
+                        result = strings[2];
+                    }
+                }
+                try {
+                    bufferedReader2.close();
+                } catch (IOException iOException222) {
+                    iOException222.printStackTrace();
+                }
+                if (exec != null) {
+                    try {
+                        exec.exitValue();
+                    } catch (Exception e5) {
+                    }
+                }
+            } catch (IOException e6) {
+                if (bufferedReader2 != null) {
+                    bufferedReader2.close();
+                }
+                if (exec != null) {
+                    exec.exitValue();
+                }
+                return result;
+            }
+        } catch (IOException e62) {
+            bufferedReader2 = null;
+            exec = null;
+            if (bufferedReader2 != null) {
+                try {
+                    bufferedReader2.close();
+                } catch (IOException e) {
+                    e.printStackTrace();
+                }
+            }
+            if (exec != null) {
+                exec.exitValue();
+            }
+            return result;
+        } catch (Throwable th4) {
+            exec = null;
+            if (bufferedReader != null) {
+                try {
+                    bufferedReader.close();
+                } catch (IOException e) {
+                    e.printStackTrace();
+                }
+            }
+            if (exec != null) {
+                exec.exitValue();
+            }
+        }
+        return result;
+    }
+
+    /**
+     * 得到MAC
+     *
+     * @return String
+     */
+    public String getMacAddress() {
+        String mac = "";
+        try {
+            mac = getLocalMacAddressFromIp();
+            if (TextUtils.isEmpty(mac)) {
+                mac = getNetworkMac();
+            }
+            if (TextUtils.isEmpty(mac)) {
+                mac = tryGetWifiMac();
+            }
+        } catch (Exception e) {
+        }
+        return mac;
+    }
+
+    /**
+     * 通过WiFiManager获取mac地址
+     * 这个方法Android 7.0是获取不到的,返回的是null,其实是返回“02:00:00:00:00:00”
+     *
+     * @return
+     */
+    public String tryGetWifiMac() {
+        String mac;
+        WifiInfo wi = wifiManager.getConnectionInfo();
+        if (wi == null || wi.getMacAddress() == null) {
+            mac = null;
+        }
+        if ("02:00:00:00:00:00".equals(wi.getMacAddress().trim())) {
+            mac = null;
+        } else {
+            mac = wi.getMacAddress().trim();
+        }
+        return mac;
+    }
+
+    /**
+     * 通过网络接口获取
+     *
+     * @return
+     */
+    public static String getNetworkMac() {
+        try {
+            List<NetworkInterface> all = Collections.list(NetworkInterface.getNetworkInterfaces());
+            for (NetworkInterface nif : all) {
+                // if (!nif.getName().equalsIgnoreCase("wlan0") && !nif.getName().equalsIgnoreCase("eth0") && !nif.getName().equalsIgnoreCase("eth1"))
+                if (!nif.getName().equalsIgnoreCase("eth0") && !nif.getName().equalsIgnoreCase("eth1") && !nif.getName().equalsIgnoreCase("eth2"))
+                    continue;
+                byte[] macBytes = nif.getHardwareAddress();
+                if (macBytes == null) {
+                    return null;
+                }
+                StringBuilder res1 = new StringBuilder();
+                for (byte b : macBytes) {
+                    res1.append(String.format("%02X:", b));
+                }
+                if (res1.length() > 0) {
+                    res1.deleteCharAt(res1.length() - 1);
+                }
+                return res1.toString();
+            }
+        } catch (Exception ex) {
+            ex.printStackTrace();
+        }
+        return null;
+    }
+
+
+    /**
+     * 根据IP地址获取MAC地址
+     *
+     * @return
+     */
+    @SuppressLint("NewApi")
+    public static String getLocalMacAddressFromIp() {
+        String strMacAddr = null;
+        try {
+            // 获得IpD地址
+            InetAddress ip = getLocalInetAddress();
+            byte[] b = NetworkInterface.getByInetAddress(ip)
+                    .getHardwareAddress();
+            StringBuffer buffer = new StringBuffer();
+            for (int i = 0; i < b.length; i++) {
+                if (i != 0) {
+                    buffer.append(':');
+                }
+                String str = Integer.toHexString(b[i] & 0xFF);
+                buffer.append(str.length() == 1 ? 0 + str : str);
+            }
+            strMacAddr = buffer.toString().toUpperCase();
+
+        } catch (Exception e) {
+
+        }
+
+        return strMacAddr;
+    }
+
+    /**
+     * 获取移动设备本地IP
+     *
+     * @return
+     */
+    public static InetAddress getLocalInetAddress() {
+        InetAddress ip = null;
+        try {
+            // 列举
+            Enumeration<NetworkInterface> en_netInterface = NetworkInterface
+                    .getNetworkInterfaces();
+            while (en_netInterface.hasMoreElements()) {// 是否还有元素
+                NetworkInterface ni = (NetworkInterface) en_netInterface
+                        .nextElement();// 得到下一个元素
+                Enumeration<InetAddress> en_ip = ni.getInetAddresses();// 得到一个ip地址的列举
+                while (en_ip.hasMoreElements()) {
+                    ip = en_ip.nextElement();
+                    if (!ip.isLoopbackAddress()
+                            && ip.getHostAddress().indexOf(":") == -1)
+                        break;
+                    else
+                        ip = null;
+                }
+
+                if (ip != null) {
+                    break;
+                }
+            }
+        } catch (SocketException e) {
+
+            e.printStackTrace();
+        }
+        return ip;
+    }
+
+    public int getNetworkType() {
+        if (connManager != null && connManager.getActiveNetworkInfo() != null) {
+            return connManager.getActiveNetworkInfo().getType();
+        }
+
+        return -1;
+    }
+}

+ 30 - 0
home/src/main/code/com/wdkl/ncs/android/component/home/util/TimeTransition.kt

@@ -0,0 +1,30 @@
+package com.wdkl.ncs.android.component.nursehome.util
+
+import com.umeng.weixin.handler.s
+import java.text.SimpleDateFormat
+import java.util.*
+
+
+class TimeTransition {
+
+    fun stampToDate(s:Long):String{
+        return TimeStampToTime(s,"yyyy-MM-dd HH:mm:ss")
+    }
+
+    fun stampToTime(s:Long):String{
+        return TimeStampToTime(s,"HH:mm:ss")
+    }
+    /**
+     * 时间戳转时间
+     */
+    fun TimeStampToTime(s:Long, timestamp:String):String{
+        val res: String
+        val simpleDateFormat = SimpleDateFormat(timestamp)
+        val lt = s
+        val date = Date(lt)
+        res = simpleDateFormat.format(date)
+        return res
+}
+
+
+}

BIN
home/src/main/res/drawable-mdpi/bao_ma_tou_xiang.png


BIN
home/src/main/res/drawable-mdpi/dian_liang.png


BIN
home/src/main/res/drawable-mdpi/geng_duo.png


BIN
home/src/main/res/drawable-mdpi/gu_ke_lie_biao.png


BIN
home/src/main/res/drawable-mdpi/hu_chu_wei_jie.png


BIN
home/src/main/res/drawable-mdpi/hu_chu_yi_jie.png


BIN
home/src/main/res/drawable-mdpi/hu_ru_wei_jie.png


BIN
home/src/main/res/drawable-mdpi/hu_ru_yi_jie.png


BIN
home/src/main/res/drawable-mdpi/hu_shi_to_xiang.png


BIN
home/src/main/res/drawable-mdpi/ju_jie.png


BIN
home/src/main/res/drawable-mdpi/sip_lian_jie.png


BIN
home/src/main/res/drawable-mdpi/tong_hu_ji_lu.png


BIN
home/src/main/res/drawable-mdpi/wei_bo_fang.png


BIN
home/src/main/res/drawable-mdpi/wei_chu_li.png


BIN
home/src/main/res/drawable-mdpi/wifi_lian_jie.png


BIN
home/src/main/res/drawable-mdpi/yi_bo_fang.png


BIN
home/src/main/res/drawable-mdpi/yi_chu_li.png


BIN
home/src/main/res/drawable-mdpi/yu_yin_gua_duan.png


BIN
home/src/main/res/drawable-mdpi/yu_yin_jie_ting.png


BIN
home/src/main/res/drawable-mdpi/zhe_die.png


+ 5 - 0
home/src/main/res/drawable/sp_event_handled.xml

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

+ 8 - 0
home/src/main/res/drawable/sp_event_unhandled_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="#F78B8F"/>
+    <corners android:topLeftRadius="0px"
+        android:topRightRadius="0px"
+        android:bottomLeftRadius="0px"
+        android:bottomRightRadius="0px"/>
+</shape>

+ 42 - 0
home/src/main/res/layout/adapter_client_list.xml

@@ -0,0 +1,42 @@
+<?xml version="1.0" encoding="utf-8"?>
+<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="match_parent"
+    android:layout_height="50px">
+
+    <RelativeLayout
+        android:layout_width="match_parent"
+        android:layout_height="match_parent">
+
+        <TextView
+            android:id="@+id/room_number_tv"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:layout_centerVertical="true"
+            android:layout_marginLeft="13px"
+            android:text="玫瑰房"
+            android:textColor="#F78B8F"
+            android:textSize="16px" />
+
+        <TextView
+            android:id="@+id/name_tv"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:layout_centerVertical="true"
+            android:layout_marginLeft="20px"
+            android:layout_toRightOf="@+id/room_number_tv"
+            android:text="张女士"
+            android:textColor="#F78B8F"
+            android:textSize="16px" />
+
+        <ImageView
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:src="@drawable/zhe_die"
+            android:layout_centerVertical="true"
+            android:layout_marginRight="12px"
+            android:layout_alignParentRight="true"/>
+
+    </RelativeLayout>
+
+
+</RelativeLayout>

+ 141 - 0
home/src/main/res/layout/adapter_watch_call_records_item.xml

@@ -0,0 +1,141 @@
+<?xml version="1.0" encoding="utf-8"?>
+<layout>
+
+    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:background="#ffffff"
+        android:layout_marginTop="6px">
+
+        <LinearLayout
+            android:id="@+id/tab_linyout"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:layout_marginLeft="9px"
+            android:layout_centerVertical="true"
+            android:orientation="vertical">
+
+            <ImageView
+                android:id="@+id/tab_imagev"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:src="@drawable/hu_ru_yi_jie" />
+
+            <ImageView
+                android:id="@+id/call_status_imagev"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:layout_marginTop="2px"
+                android:src="@drawable/hu_ru_yi_jie"
+                android:visibility="gone"/>
+        </LinearLayout>
+
+        <RelativeLayout
+            android:layout_width="match_parent"
+            android:layout_height="match_parent"
+            android:layout_marginTop="4px"
+            android:layout_marginRight="9px"
+            android:layout_toRightOf="@+id/tab_linyout">
+
+            <RelativeLayout
+                android:id="@+id/room_name_linlyout"
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:layout_marginLeft="6px">
+
+                <TextView
+                    android:id="@+id/sickbed_tv"
+                    android:layout_width="wrap_content"
+                    android:layout_height="wrap_content"
+                    android:text="05房01床"
+                    android:textSize="14px" />
+
+                <TextView
+                    android:id="@+id/call_time_tv"
+                    android:layout_width="wrap_content"
+                    android:layout_height="wrap_content"
+                    android:layout_alignParentRight="true"
+                    android:text="12:00:00"
+                    android:textSize="12px" />
+
+            </RelativeLayout>
+
+            <RelativeLayout
+                android:id="@+id/nursing_project_relalyout"
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:layout_below="@+id/room_name_linlyout"
+                android:layout_marginLeft="6px"
+                android:layout_marginTop="4px"
+                android:orientation="vertical">
+
+                <TextView
+                    android:id="@+id/name_tv"
+                    android:layout_width="wrap_content"
+                    android:layout_height="wrap_content"
+                    android:text="zhangx"
+                    android:textSize="14px" />
+
+                <LinearLayout
+                    android:id="@+id/incident_linlyou"
+                    android:layout_width="wrap_content"
+                    android:layout_height="wrap_content"
+                    android:layout_alignParentRight="true"
+                    android:orientation="horizontal">
+
+                    <ImageView
+                        android:id="@+id/treatment_state_imagev"
+                        android:layout_width="wrap_content"
+                        android:layout_height="wrap_content"
+                        android:layout_gravity="center"
+                        android:layout_marginRight="6px"
+                        android:src="@drawable/yi_chu_li" />
+
+
+                    <TextView
+                        android:id="@+id/project_tv"
+                        android:layout_width="59px"
+                        android:layout_height="20px"
+                        android:gravity="center"
+                        android:text="啊哈哈"
+                        android:background="@drawable/sp_event_handled"
+                        android:textSize="12px"
+                         />
+
+                    <ImageView
+                        android:id="@+id/play_tv"
+                        android:layout_width="wrap_content"
+                        android:layout_height="wrap_content"
+                        android:background="@drawable/wei_bo_fang"
+                        android:gravity="center"
+                        android:visibility="gone"/>
+
+                </LinearLayout>
+            </RelativeLayout>
+
+            <LinearLayout
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:layout_below="@+id/nursing_project_relalyout"
+                android:layout_alignParentRight="true"
+                android:layout_marginTop="4px"
+                android:orientation="horizontal">
+
+                <TextView
+                    android:id="@+id/conductor_name_tv"
+                    android:layout_width="wrap_content"
+                    android:layout_height="wrap_content"
+                    android:layout_marginRight="10px"
+                    android:text="处理人"
+                    android:textSize="12px" />
+
+                <TextView
+                    android:id="@+id/processing_time_tv"
+                    android:layout_width="wrap_content"
+                    android:layout_height="wrap_content"
+                    android:text="12:00:00"
+                    android:textSize="12px" />
+            </LinearLayout>
+        </RelativeLayout>
+    </RelativeLayout>
+</layout>

+ 46 - 0
home/src/main/res/layout/adapter_watch_contacts_item.xml

@@ -0,0 +1,46 @@
+<?xml version="1.0" encoding="utf-8"?>
+<layout>
+
+    <RelativeLayout
+        xmlns:android="http://schemas.android.com/apk/res/android"
+        android:layout_width="match_parent"
+        android:layout_height="50px"
+        android:layout_marginTop="7px"
+        android:background="#FFFFFF ">
+
+        <RelativeLayout
+            android:layout_width="match_parent"
+            android:layout_height="match_parent">
+
+            <TextView
+                android:id="@+id/room_number_tv"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:layout_centerVertical="true"
+                android:layout_marginLeft="13px"
+                android:text="玫瑰房"
+                android:textColor="#F78B8F"
+                android:textSize="16px" />
+
+            <TextView
+                android:id="@+id/name_tv"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:layout_centerVertical="true"
+                android:layout_marginLeft="20px"
+                android:layout_toRightOf="@+id/room_number_tv"
+                android:text="张女士"
+                android:textColor="#F78B8F"
+                android:textSize="16px" />
+
+            <ImageView
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:layout_alignParentRight="true"
+                android:layout_centerVertical="true"
+                android:layout_marginRight="12px"
+                android:src="@drawable/zhe_die" />
+
+        </RelativeLayout>
+    </RelativeLayout>
+</layout>

+ 24 - 0
home/src/main/res/layout/watch_activity_call_records.xml

@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="utf-8"?>
+<layout xmlns:bind="http://schemas.android.com/apk/res-auto">
+
+    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
+        android:layout_width="match_parent"
+        android:layout_height="match_parent">
+
+        <com.scwang.smartrefresh.layout.SmartRefreshLayout
+            android:id="@+id/refresh"
+            android:layout_width="match_parent"
+            android:layout_height="match_parent"
+            android:layout_marginLeft="6px"
+            android:layout_marginRight="6px"
+            bind:srlEnableLoadMore="true"
+            bind:srlEnableRefresh="true">
+
+            <android.support.v7.widget.RecyclerView
+                android:id="@+id/call_records_recyv"
+                android:layout_width="match_parent"
+                android:layout_height="match_parent"></android.support.v7.widget.RecyclerView>
+        </com.scwang.smartrefresh.layout.SmartRefreshLayout>
+
+    </RelativeLayout>
+</layout>

+ 57 - 0
home/src/main/res/layout/watch_activity_dialing_voice.xml

@@ -0,0 +1,57 @@
+<?xml version="1.0" encoding="utf-8"?>
+<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    android:background="#FFE6E8">
+
+    <LinearLayout
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:layout_centerHorizontal="true"
+        android:layout_marginTop="11px"
+        android:orientation="vertical">
+
+        <ImageView
+            android:id="@+id/bao_mother_image_imagev"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:src="@drawable/bao_ma_tou_xiang" />
+
+        <TextView
+            android:id="@+id/bao_mother_name_tv"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:layout_gravity="center_horizontal"
+            android:layout_marginTop="8px"
+            android:text="宝妈名字"
+            android:textSize="16px" />
+
+    </LinearLayout>
+
+    <LinearLayout
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:layout_alignParentBottom="true"
+        android:layout_centerHorizontal="true"
+        android:layout_marginBottom="11px"
+        android:orientation="vertical">
+
+        <TextView
+            android:id="@+id/call_duration_tv"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:layout_gravity="center_horizontal"
+            android:text="00:00:12"
+            android:textSize="16px" />
+
+        <ImageView
+            android:id="@+id/hang_up_imagev"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:layout_marginTop="13px"
+            android:src="@drawable/yu_yin_gua_duan" />
+
+    </LinearLayout>
+
+
+</RelativeLayout>

+ 201 - 0
home/src/main/res/layout/watch_activity_home.xml

@@ -0,0 +1,201 @@
+<?xml version="1.0" encoding="utf-8"?>
+<layout>
+
+    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
+        android:layout_width="match_parent"
+        android:layout_height="match_parent">
+
+        <LinearLayout
+            android:layout_width="match_parent"
+            android:layout_height="match_parent"
+            android:orientation="vertical">
+
+            <LinearLayout
+                android:layout_width="match_parent"
+                android:layout_height="0dp"
+                android:layout_weight="1">
+
+                <LinearLayout
+                    android:id="@+id/customer_list_linlyout"
+                    android:layout_width="0dp"
+                    android:layout_height="match_parent"
+                    android:layout_weight="1"
+                    android:background="#00B5DC"
+                    android:gravity="center"
+                    android:orientation="vertical">
+
+                    <ImageView
+                        android:layout_width="wrap_content"
+                        android:layout_height="wrap_content"
+                        android:src="@drawable/gu_ke_lie_biao" />
+
+                    <TextView
+                        android:layout_width="wrap_content"
+                        android:layout_height="wrap_content"
+                        android:layout_marginTop="10px"
+                        android:text="顾客列表"
+                        android:textColor="#ffffff"
+                        android:textSize="16px" />
+
+                </LinearLayout>
+
+                <LinearLayout
+                    android:id="@+id/call_records_linlyout"
+                    android:layout_width="0dp"
+                    android:layout_height="match_parent"
+                    android:layout_weight="1"
+                    android:background="#E56D37"
+                    android:gravity="center"
+                    android:orientation="vertical">
+
+                    <ImageView
+                        android:layout_width="wrap_content"
+                        android:layout_height="wrap_content"
+                        android:src="@drawable/tong_hu_ji_lu" />
+
+                    <TextView
+                        android:layout_width="wrap_content"
+                        android:layout_height="wrap_content"
+                        android:layout_marginTop="10px"
+                        android:text="通话记录"
+                        android:textColor="#ffffff"
+                        android:textSize="16px" />
+
+                </LinearLayout>
+
+            </LinearLayout>
+
+            <LinearLayout
+                android:layout_width="match_parent"
+                android:layout_height="0dp"
+                android:layout_weight="1"
+                android:orientation="horizontal">
+
+                <LinearLayout
+                    android:id="@+id/user_nume_linlyout"
+                    android:layout_width="0dp"
+                    android:layout_height="match_parent"
+                    android:layout_weight="1"
+                    android:background="#5CB615"
+                    android:gravity="center"
+                    android:orientation="vertical">
+
+                    <ImageView
+                        android:layout_width="wrap_content"
+                        android:layout_height="wrap_content"
+                        android:src="@drawable/hu_shi_to_xiang" />
+
+                    <TextView
+                        android:id="@+id/watch_name_tv"
+                        android:layout_width="wrap_content"
+                        android:layout_height="wrap_content"
+                        android:layout_marginTop="10px"
+                        android:text="王护士"
+                        android:textColor="#ffffff"
+                        android:textSize="16px" />
+
+                </LinearLayout>
+
+                <LinearLayout
+                    android:id="@+id/state_linlyout"
+                    android:layout_width="0dp"
+                    android:layout_height="match_parent"
+                    android:layout_weight="1"
+                    android:gravity="center"
+                    android:orientation="vertical">
+
+                    <LinearLayout
+                        android:layout_width="match_parent"
+                        android:layout_height="0dp"
+                        android:layout_weight="1"
+                        android:orientation="horizontal">
+
+                        <LinearLayout
+                            android:layout_width="0dp"
+                            android:layout_height="match_parent"
+                            android:layout_weight="1"
+                            android:background="#EA89C0"
+                            android:gravity="center">
+
+                            <ImageView
+                                android:id="@+id/network_state_imagev"
+                                android:layout_width="wrap_content"
+                                android:layout_height="wrap_content"
+                                android:src="@drawable/wifi_lian_jie" />
+
+                        </LinearLayout>
+
+
+                        <LinearLayout
+                            android:layout_width="0dp"
+                            android:layout_height="match_parent"
+                            android:layout_weight="1"
+                            android:background="#FF9900"
+                            android:gravity="center">
+
+                            <ImageView
+                                android:id="@+id/sip_state_imagev"
+                                android:layout_width="wrap_content"
+                                android:layout_height="wrap_content"
+                                android:src="@drawable/sip_lian_jie" />
+
+                        </LinearLayout>
+
+
+                    </LinearLayout>
+
+                    <LinearLayout
+                        android:layout_width="match_parent"
+                        android:layout_height="0dp"
+                        android:layout_weight="1"
+                        android:orientation="horizontal">
+
+                        <LinearLayout
+                            android:layout_width="0dp"
+                            android:layout_height="match_parent"
+                            android:layout_weight="1"
+                            android:background="#48CFB0"
+                            android:gravity="center"
+                            android:orientation="vertical">
+
+                            <ImageView
+                                android:id="@+id/electric_quantity_imagev"
+                                android:layout_width="wrap_content"
+                                android:layout_height="wrap_content"
+                                android:src="@drawable/dian_liang" />
+
+                            <TextView
+                                android:id="@+id/electric_quantity_tv"
+                                android:layout_width="wrap_content"
+                                android:layout_height="wrap_content"
+                                android:text="电量100%"
+                                android:textColor="#ffffff"
+                                android:textSize="16px" />
+                        </LinearLayout>
+
+
+                        <LinearLayout
+                            android:layout_width="0dp"
+                            android:layout_height="match_parent"
+                            android:layout_weight="1"
+                            android:background="#FFDE00"
+                            android:gravity="center">
+
+                            <ImageView
+                                android:layout_width="wrap_content"
+                                android:layout_height="wrap_content"
+                                android:src="@drawable/geng_duo" />
+
+                        </LinearLayout>
+
+                    </LinearLayout>
+
+                </LinearLayout>
+
+            </LinearLayout>
+
+
+        </LinearLayout>
+
+    </RelativeLayout>
+</layout>

+ 13 - 0
home/src/main/res/layout/watch_activity_register.xml

@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="utf-8"?>
+<layout>
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent">
+<TextView
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    android:layout_marginTop="40dp"
+    android:textSize="20dp"
+    android:text="注册页面"/>
+</LinearLayout>
+</layout>

+ 67 - 0
home/src/main/res/layout/watch_activity_voice_calls.xml

@@ -0,0 +1,67 @@
+<?xml version="1.0" encoding="utf-8"?>
+<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    android:background="#FFE6E8">
+
+    <LinearLayout
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:layout_centerHorizontal="true"
+        android:layout_marginTop="11px"
+        android:orientation="vertical">
+
+        <ImageView
+            android:id="@+id/bao_mother_image_imagev"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:src="@drawable/bao_ma_tou_xiang" />
+
+        <TextView
+            android:id="@+id/bao_mother_name_tv"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:layout_gravity="center_horizontal"
+            android:layout_marginTop="8px"
+            android:text="宝妈名字"
+            android:textSize="16px" />
+
+    </LinearLayout>
+
+
+    <TextView
+        android:id="@+id/call_duration_tv"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:layout_above="@+id/call_out_linlyout"
+        android:layout_centerHorizontal="true"
+        android:text="00:00:12"
+        android:textSize="16px" />
+
+    <LinearLayout
+        android:id="@+id/call_out_linlyout"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:layout_alignParentBottom="true"
+        android:layout_centerHorizontal="true"
+        android:layout_marginTop="13px"
+        android:layout_marginBottom="11px"
+        android:orientation="horizontal">
+
+        <ImageView
+            android:id="@+id/hang_up_imagev"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:src="@drawable/yu_yin_gua_duan" />
+
+        <ImageView
+            android:id="@+id/call_the_voice_imagev"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:layout_marginLeft="20px"
+            android:src="@drawable/yu_yin_jie_ting" />
+
+    </LinearLayout>
+
+
+</RelativeLayout>

+ 0 - 27
home/src/main/res/layout/watch_contacts_item.xml

@@ -1,27 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<layout>
-    <android.support.constraint.ConstraintLayout
-        android:layout_width="match_parent"
-        xmlns:android="http://schemas.android.com/apk/res/android"
-        xmlns:app="http://schemas.android.com/apk/res-auto"
-        android:layout_height="50dp">
-        <TextView
-            android:id="@+id/watch_contacts_item_room_name"
-            android:layout_width="match_parent"
-            android:layout_height="wrap_content"
-            app:layout_constraintTop_toTopOf="parent"
-            app:layout_constraintLeft_toLeftOf="parent"
-            android:text="@string/app_name"/>
-        <TextView
-            android:id="@+id/watch_contacts_item_customer_name"
-            android:layout_width="match_parent"
-            android:layout_height="20sp"
-            app:layout_constraintBottom_toBottomOf="parent"
-            app:layout_constraintRight_toRightOf="parent"
-            android:textSize="15sp"
-            android:gravity="center_vertical"
-            android:textColor="@color/javashop_color_white"
-            android:background="#77000000"
-            />
-    </android.support.constraint.ConstraintLayout>
-</layout>

+ 14 - 9
home/src/main/res/layout/watch_contacts_lay.xml

@@ -1,23 +1,28 @@
 <?xml version="1.0" encoding="utf-8"?>
 <layout>
-    <android.support.constraint.ConstraintLayout
-        xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent"
+
+    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
+        xmlns:bind="http://schemas.android.com/apk/res-auto"
+        android:layout_width="match_parent"
         android:layout_height="match_parent"
-        xmlns:bind="http://schemas.android.com/apk/res-auto">
+        android:background="#FFE6E8">
 
         <com.scwang.smartrefresh.layout.SmartRefreshLayout
             android:id="@+id/refresh"
             android:layout_width="match_parent"
-            bind:srlEnableRefresh="true"
-            bind:srlEnableLoadMore="true"
             android:layout_height="match_parent"
-            >
+            android:layout_marginLeft="6px"
+            android:layout_marginRight="6px"
+            bind:srlEnableLoadMore="true"
+            bind:srlEnableRefresh="true">
+
             <android.support.v7.widget.RecyclerView
                 android:id="@+id/watch_contacts_list"
                 android:layout_width="match_parent"
-                android:layout_height="match_parent"
-                ></android.support.v7.widget.RecyclerView>
+                android:layout_height="match_parent">
+
+            </android.support.v7.widget.RecyclerView>
         </com.scwang.smartrefresh.layout.SmartRefreshLayout>
 
-    </android.support.constraint.ConstraintLayout>
+    </RelativeLayout>
 </layout>

+ 27 - 0
middleware/src/main/code/com/wdkl/ncs/android/middleware/api/ApiManager.kt

@@ -132,8 +132,35 @@ object ApiManager {
 
         val API_HELLO :HelloApi by lazy { apiFactory.createService(HelloApi::class.java, urlManager.device_url)}
 
+        /**
+         * 获取用户列表api
+         */
         val API_DEVICE :DeviceApi by lazy { apiFactory.createService(DeviceApi::class.java, urlManager.device_url) }
 
+        /**
+         * @Name  API_NurseHome
+         * @Type  API_NurseHome
+         * @Note  通话记录
+         */
+        val API_CallRecords :WatchCallRecordsFragmentApi by lazy { apiFactory.createService(WatchCallRecordsFragmentApi::class.java, urlManager.device_url)}
+
+
+
+        /**
+         * @Name
+         * @Type  API_RegisterDevice
+         * @Note
+         */
+        val API_RegisterDevice :RegisterDeviceApi by lazy { apiFactory.createService(RegisterDeviceApi::class.java, urlManager.device_url)}
+
+
+        /**
+         * @Name
+         * @Type  Api_WatchInitiator
+         * @Note
+         */
+        val Api_WatchInitiator :WatchInitiatorApi by lazy { apiFactory.createService(WatchInitiatorApi::class.java, urlManager.device_url)}
+
 
         /**
          * @author LDD

+ 4 - 4
middleware/src/main/code/com/wdkl/ncs/android/middleware/api/DeviceApi.kt

@@ -7,9 +7,9 @@ import retrofit2.http.POST
 import retrofit2.http.Path
 import retrofit2.http.Query
 
-interface DeviceApi{
+interface DeviceApi {
     @POST("watch")
-    fun getWatchContacts(@Query("device_id") deviceId :Int,
-                         @Query("page_no") pageNo :Int,
-                         @Query("page_size") pageSize :Int = ApiManager.PAGE_SIZE): Observable<ResponseBody>
+    fun getWatchContacts(@Query("page_no") pageNo: Int,
+                         @Query("device_id") deviceId: Int,
+                         @Query("page_size") pageSize: Int= ApiManager.PAGE_SIZE): Observable<ResponseBody>
 }

+ 16 - 0
middleware/src/main/code/com/wdkl/ncs/android/middleware/api/RegisterDeviceApi.kt

@@ -0,0 +1,16 @@
+package com.wdkl.ncs.android.middleware.api
+
+import io.reactivex.Observable
+import okhttp3.ResponseBody
+import retrofit2.http.GET
+import retrofit2.http.POST
+import retrofit2.http.Path
+import retrofit2.http.Query
+
+interface RegisterDeviceApi {
+
+    @GET("/ncs_nurseDevice/device/getDeviceByEthMac/{eth_mac}")
+    fun getDeviceMessage(@Path("eth_mac")eth_mac:String): Observable<ResponseBody>
+
+
+}

+ 2 - 2
middleware/src/main/code/com/wdkl/ncs/android/middleware/api/UrlManager.kt

@@ -54,7 +54,7 @@ interface UrlManager {
 private class DevUrlManager : UrlManager{
 
     override val base: String
-        get() = "http://192.168.1.188"
+        get() = "http://47.106.200.55"
 
     override val device_url: String
         get() = "${base}:8006/"
@@ -72,7 +72,7 @@ private class DevUrlManager : UrlManager{
 private class ProUrlManager : UrlManager{
 
     override val base: String
-        get() = "http://192.168.1.188"
+        get() = "http://47.106.200.55"
 
     override val device_url: String
         get() = String.format(base,"device_url")

+ 18 - 0
middleware/src/main/code/com/wdkl/ncs/android/middleware/api/WatchCallRecordsFragmentApi.kt

@@ -0,0 +1,18 @@
+package com.wdkl.ncs.android.middleware.api
+
+import io.reactivex.Observable
+import okhttp3.ResponseBody
+import retrofit2.http.GET
+import retrofit2.http.POST
+import retrofit2.http.Path
+import retrofit2.http.Query
+
+/**
+ * 获取呼叫记录列表api
+ */
+interface WatchCallRecordsFragmentApi{
+
+     @POST("/watch/getInteractionVOByDeviceId")
+    fun getCallRecords(@Query("page_no")page_no:Int,@Query("page_size")page_size:Int
+                       ,@Query("device_id")device_id:Int): Observable<ResponseBody>
+}

+ 18 - 0
middleware/src/main/code/com/wdkl/ncs/android/middleware/api/WatchInitiatorApi.kt

@@ -0,0 +1,18 @@
+package com.wdkl.ncs.android.middleware.api
+
+import io.reactivex.Observable
+import okhttp3.ResponseBody
+import retrofit2.http.GET
+import retrofit2.http.POST
+import retrofit2.http.Path
+import retrofit2.http.Query
+
+/**
+ * 获取呼叫记录列表api
+ */
+interface WatchInitiatorApi{
+
+     @POST("/watch/getInteractionVOByCustomerId")
+    fun getInitiatorData(@Query("page_no")page_no:Int,@Query("page_size")page_size:Int
+                       ,@Query("customer_id")customer_id:Int): Observable<ResponseBody>
+}

+ 14 - 0
middleware/src/main/code/com/wdkl/ncs/android/middleware/common/Constants.kt

@@ -0,0 +1,14 @@
+package com.wdkl.ncs.android.component.nursehome.common
+
+class Constants {
+    companion object {
+        var mac: String =""//设备Mac
+        var frame_id: String =""//医院结构ID
+        var eth_ip: String ="" //当前设备的IP
+        var ids: String =""//当前设备的ID
+        var sip_id: String =""//sip
+
+    }
+
+
+}

+ 33 - 0
middleware/src/main/code/com/wdkl/ncs/android/middleware/di/ApiProvides.kt

@@ -189,4 +189,37 @@ class ApiProvides {
     fun provideDeviceApi():DeviceApi{
         return ApiManager.API_DEVICE
     }
+
+    /**
+     * @author LDD
+     * @From   ApplicationComponent
+     * @Date
+     * @Note   通话记录api
+     */
+    @Provides
+    fun provideCallRecordsFragmentApi():WatchCallRecordsFragmentApi{
+        return  ApiManager.API_CallRecords
+    }
+
+    /**
+     * @author LDD
+     * @From   ApplicationComponent
+     * @Date
+     * @Note
+     */
+    @Provides
+    fun provideRegisterDeviceApi():RegisterDeviceApi{
+        return  ApiManager.API_RegisterDevice
+    }
+
+    /**
+     * @author LDD
+     * @From   ApplicationComponent
+     * @Date
+     * @Note
+     */
+    @Provides
+    fun provideWatchInitiatorApi():WatchInitiatorApi{
+        return  ApiManager.Api_WatchInitiator
+    }
 }

+ 24 - 0
middleware/src/main/code/com/wdkl/ncs/android/middleware/di/ApplicationComponent.kt

@@ -140,4 +140,28 @@ interface ApplicationComponent {
     fun provideHelloApi(): HelloApi
 
     fun provideDeviceApi() :DeviceApi
+
+    /**
+     * @author LDD
+     * @From   ApplicationComponent
+     * @Date
+     * @Note   通话记录Api
+     */
+    fun provideCallRecordsFragmentApi(): WatchCallRecordsFragmentApi
+
+    /**
+     * @author LDD
+     * @From   ApplicationComponent
+     * @Date
+     * @Note
+     */
+    fun provideRegisterDeviceApi(): RegisterDeviceApi
+
+    /**
+     * @author LDD
+     * @From   ApplicationComponent
+     * @Date
+     * @Note
+     */
+    fun provideWatchInitiatorApi(): WatchInitiatorApi
 }

+ 9 - 4
middleware/src/main/code/com/wdkl/ncs/android/middleware/di/PresenterComponent.kt

@@ -3,10 +3,7 @@ package com.wdkl.ncs.android.middleware.di
 import com.wdkl.ncs.android.middleware.logic.presenter.extra.ScanPresenter
 import com.wdkl.ncs.android.middleware.logic.presenter.hello.HelloActivityPresenter
 import com.wdkl.ncs.android.middleware.logic.presenter.hello.HelloListActivityPresenter
-import com.wdkl.ncs.android.middleware.logic.presenter.home.CategoryFragmentPresenter
-import com.wdkl.ncs.android.middleware.logic.presenter.home.HomeActivityPresenter
-import com.wdkl.ncs.android.middleware.logic.presenter.home.HomeFragmentPresenter
-import com.wdkl.ncs.android.middleware.logic.presenter.home.WatchActivityPresenter
+import com.wdkl.ncs.android.middleware.logic.presenter.home.*
 import com.wdkl.ncs.android.middleware.logic.presenter.setting.SettingActivityPresenter
 import com.wdkl.ncs.android.middleware.logic.presenter.shop.*
 import com.wdkl.ncs.android.middleware.logic.presenter.welcome.WelcomePresenter
@@ -52,5 +49,13 @@ interface PresenterComponent {
 
     fun inject(presenter: HelloListActivityPresenter)
 
+
+    //手表相关的
+    fun inject(presenter: WatchHomeActivityPresenter)
+
     fun inject(presenter: WatchActivityPresenter)
+
+    fun inject(presenter: WatchCallRecordsFragmentPresenter)
+
+    fun inject(presenter: WatchDevicePresenter)
 }

+ 1 - 1
middleware/src/main/code/com/wdkl/ncs/android/middleware/logic/contract/home/WatchActivityContract.kt

@@ -8,6 +8,6 @@ interface WatchActivityContract{
         fun render(data: ArrayList<WatchContactsVO>)
     }
     interface Presenter : BaseContract.BasePresenter{
-        fun loadData(deviceId :Int ,page : Int)
+        fun loadData(page : Int,deviceId :Int )
     }
 }

+ 60 - 0
middleware/src/main/code/com/wdkl/ncs/android/middleware/logic/contract/home/WatchCallRecordsFragmentContract.kt

@@ -0,0 +1,60 @@
+package com.wdkl.ncs.android.middleware.logic.contract.home
+
+import com.wdkl.ncs.android.lib.base.BaseContract
+import com.wdkl.ncs.android.middleware.model.vo.InteractionVO
+import org.json.JSONArray
+
+/**
+ * @author LDD
+ * @Date   2018/1/19 下午5:50
+ * @From   com.wdkl.ncs.android.middleware.logic.contract.home
+ * @Note   CallRecordsFragment接口控制器
+ */
+interface WatchCallRecordsFragmentContract {
+
+    /**
+     * @author LDD
+     * @Date   2018/1/19 下午5:51
+     * @From   HomeFragmentContract
+     * @Note   View接口
+     */
+    interface View : BaseContract.BaseView{
+
+        /**
+         * @author LDD
+         * @Date   2018/1/19 下午5:51
+         * @From   HomeFragmentContract.View
+         * @Note   展示七巧板数据
+         */
+        fun renderFloor(data : ArrayList<InteractionVO>)
+
+        /**
+         *  显示呼叫人的呼叫数据
+         */
+        fun showInitiatorData(data : ArrayList<InteractionVO>)
+
+    }
+
+    /**
+     * @author LDD
+     * @Date   2018/1/19 下午5:51
+     * @From   HomeFragmentContract
+     * @Note   逻辑控制接口
+     */
+    interface Presenter : BaseContract.BasePresenter{
+
+        /**
+         * @author LDD
+         * @From   HomeFragmentContract.Presenter
+         * @Date   2018/1/19 下午5:53
+         * @Note   加载七巧板数据
+         */
+        fun loadFloor(ACTION:String, page_no:Int, page_size:Int, device_id:Int, customer_id:Int)
+
+//        /**
+//         * 获取呼叫人的呼叫记录
+//         */
+//        fun loadInitiatorData(page_no:Int,page_size:Int,customer_id:Int)
+
+    }
+}

+ 26 - 0
middleware/src/main/code/com/wdkl/ncs/android/middleware/logic/contract/home/WatchDeviceContract.kt

@@ -0,0 +1,26 @@
+package com.wdkl.ncs.android.middleware.logic.contract.home
+
+import com.wdkl.ncs.android.lib.base.BaseContract
+import com.wdkl.ncs.android.middleware.model.dos.BroadcastDO
+import com.wdkl.ncs.android.middleware.model.dos.DeviceDO
+
+/**
+ * 获取当前设备数据接口
+ */
+interface WatchDeviceContract {
+    /**
+     * 显示当前设备数据
+     */
+    interface View: BaseContract.BaseView{
+        fun showData(data : DeviceDO)
+    }
+
+    /**
+     * 获取当前设备数据
+     */
+  interface Presenter:BaseContract.BasePresenter{
+      fun loadData(eth_mac:String)
+  }
+
+
+}

+ 13 - 0
middleware/src/main/code/com/wdkl/ncs/android/middleware/logic/contract/home/WatchHomeActivityContract.kt

@@ -0,0 +1,13 @@
+package com.wdkl.ncs.android.middleware.logic.contract.home
+
+import com.wdkl.ncs.android.lib.base.BaseContract
+import com.wdkl.ncs.android.middleware.model.vo.WatchContactsVO
+
+interface WatchHomeActivityContract{
+    interface View : BaseContract.BaseView{
+        fun render()
+    }
+    interface Presenter : BaseContract.BasePresenter{
+        fun loadData()
+    }
+}

+ 17 - 15
middleware/src/main/code/com/wdkl/ncs/android/middleware/logic/presenter/home/WatchActivityPresenter.kt

@@ -18,24 +18,12 @@ import io.reactivex.disposables.Disposable
 import javax.inject.Inject
 
 class WatchActivityPresenter @Inject constructor(): RxPresenter<WatchActivityContract.View>(),WatchActivityContract.Presenter{
-    override fun bindDagger() {
-        MiddlewareDaggerComponent.component.inject(this)
-    }
+
     @Inject
     protected lateinit var deviceApi: DeviceApi
 
-    override fun loadData(deviceId: Int, page: Int) {
-        deviceApi.getWatchContacts(deviceId,page)
-                .map {
-                    var data = ArrayList<WatchContactsVO>()
-                    var gson = GsonBuilder().setFieldNamingPolicy(FieldNamingPolicy.LOWER_CASE_WITH_UNDERSCORES).create()
-                    it.toJsonObject().valueJsonArray("data").arrayObjects().forEach({ dic ->
-                        data.add(gson.fromJson(dic.toString(),WatchContactsVO::class.java))
-                    })
-                    return@map data
-                }
-                .compose(ThreadFromUtils.defaultSchedulers())
-                .subscribe(observer)
+    override fun bindDagger() {
+        MiddlewareDaggerComponent.component.inject(this)
     }
 
     private val observer = object : ConnectionObserver<Any>(){
@@ -56,4 +44,18 @@ class WatchActivityPresenter @Inject constructor(): RxPresenter<WatchActivityCon
             addDisposable(var1)
         }
     }
+
+    override fun loadData(page: Int,deviceId: Int) {
+        deviceApi.getWatchContacts(page,deviceId)
+                .map {
+                    var data = ArrayList<WatchContactsVO>()
+                    var gson = GsonBuilder().setFieldNamingPolicy(FieldNamingPolicy.LOWER_CASE_WITH_UNDERSCORES).create()
+                    it.toJsonObject().valueJsonArray("data").arrayObjects().forEach({ dic ->
+                        data.add(gson.fromJson(dic.toString(),WatchContactsVO::class.java))
+                    })
+                    return@map data
+                }
+                .compose(ThreadFromUtils.defaultSchedulers())
+                .subscribe(observer)
+    }
 }

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

@@ -0,0 +1,128 @@
+package com.wdkl.ncs.android.middleware.logic.presenter.home
+
+import android.annotation.SuppressLint
+import android.util.Log
+import com.wdkl.ncs.android.lib.base.RxPresenter
+import com.wdkl.ncs.android.lib.utils.*
+import com.wdkl.ncs.android.middleware.di.MiddlewareDaggerComponent
+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.middleware.api.WatchCallRecordsFragmentApi
+import com.wdkl.ncs.android.middleware.api.WatchInitiatorApi
+import com.wdkl.ncs.android.middleware.logic.contract.home.WatchCallRecordsFragmentContract
+import com.wdkl.ncs.android.middleware.model.vo.InteractionVO
+import io.reactivex.disposables.Disposable
+import javax.inject.Inject
+
+/**
+ * @author LDD
+ * @Date   2018/1/19 下午5:42
+ * @From   com.wdkl.ncs.android.middleware.logic.presenter.home
+ * @Note   CallRecordsFragment逻辑控制器
+ */
+class WatchCallRecordsFragmentPresenter @Inject constructor() :RxPresenter<WatchCallRecordsFragmentContract.View>(),WatchCallRecordsFragmentContract.Presenter  {
+
+
+    /**
+     * @Name  CallRecordsFragmentApi
+     * @Type  CallRecordsFragmentApi
+     * @Note  通话记录Api
+     */
+    @Inject
+    protected lateinit var callRecordsFragmentApi: WatchCallRecordsFragmentApi
+
+    @Inject
+    protected lateinit var watchInitiatorApi: WatchInitiatorApi
+
+    /**
+     * @Name  observer
+     * @Type  ConnectionObserver
+     * @Note  数据监听者
+     */
+    private val observer = object : ConnectionObserver<Any>() {
+        override fun onStartWithConnection() {
+            providerView()
+        }
+
+        @SuppressLint("LongLogTag")
+        override fun onNextWithConnection(result: Any, connectionQuality: ConnectionQuality) {
+            providerView().complete()
+//            Log.e("WatchCallRecordsFragmentPresenter","result "+result)
+            providerView().renderFloor(result as ArrayList<InteractionVO>)
+//            providerView().showInitiatorData(result as ArrayList<InteractionVO>)
+        }
+
+        override fun onErrorWithConnection(error: ExceptionHandle.ResponeThrowable, connectionQuality: ConnectionQuality) {
+            providerView().onError(error.customMessage)
+        }
+
+        override fun attachSubscribe(var1: Disposable) {
+            addDisposable(var1)
+        }
+    }
+
+
+    /**
+     * @author LDD
+     * @From   HomeFragmentPresenter
+     * @Date   2018/1/19 下午6:28
+     * @Note   依赖注入初始化
+     */
+    override fun bindDagger() {
+        MiddlewareDaggerComponent.component.inject(this)
+    }
+
+    /**
+     * @author LDD
+     * @From   HomeFragmentPresenter
+     * @Date   2018/1/19 下午5:55
+     * @Note   加载七巧板数据
+     */
+    @SuppressLint("LongLogTag")
+    override fun loadFloor(ACTION:String,page_no:Int,page_size:Int,device_id:Int,customer_id: Int) {
+        //page_no页码  page_size每页显示的数量  device_id设备ID
+        Log.e("WatchCallRecordsFragmentPresenter","qqqqqqq")
+        //获取全部通话记录数据
+        if(ACTION .equals("ALL")){
+            //待处理
+            callRecordsFragmentApi.getCallRecords(page_no,page_size,device_id)
+                    .map {
+                        var shop = ArrayList<InteractionVO>()
+                        var gson = GsonBuilder().setFieldNamingPolicy(FieldNamingPolicy.LOWER_CASE_WITH_UNDERSCORES).create()
+//                    var gson = Gson();
+
+                        it.toJsonObject().valueJsonArray("data").arrayObjects().forEach({ dic ->
+                            shop.add(gson.fromJson(dic.toString(),InteractionVO::class.java))
+                        })
+                        return@map shop
+                    }
+                    .compose(ThreadFromUtils.defaultSchedulers())
+                    .subscribe(observer)
+        }else{
+            //获取指定人的通话记录数据
+            watchInitiatorApi.getInitiatorData(page_no,page_size,customer_id)
+                    .map {
+                        var shop = ArrayList<InteractionVO>()
+                        var gson = GsonBuilder().setFieldNamingPolicy(FieldNamingPolicy.LOWER_CASE_WITH_UNDERSCORES).create()
+//                    var gson = Gson();
+
+                        it.toJsonObject().valueJsonArray("data").arrayObjects().forEach({ dic ->
+                            shop.add(gson.fromJson(dic.toString(),InteractionVO::class.java))
+                        })
+                        return@map shop
+                    }
+                    .compose(ThreadFromUtils.defaultSchedulers())
+                    .subscribe(observer)
+
+        }
+
+    }
+
+//    override fun loadInitiatorData(page_no: Int, page_size: Int, device_id: Int) {
+//
+//
+//    }
+}

+ 75 - 0
middleware/src/main/code/com/wdkl/ncs/android/middleware/logic/presenter/home/WatchDevicePresenter.kt

@@ -0,0 +1,75 @@
+package com.wdkl.ncs.android.middleware.logic.presenter.home
+
+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.RegisterDeviceApi
+import com.wdkl.ncs.android.middleware.di.MiddlewareDaggerComponent
+import com.wdkl.ncs.android.middleware.logic.contract.home.WatchDeviceContract
+import com.wdkl.ncs.android.middleware.model.dos.DeviceDO
+import io.reactivex.disposables.Disposable
+import javax.inject.Inject
+
+/**
+ * RegisterActivity逻辑控制
+ */
+class WatchDevicePresenter@Inject constructor() :RxPresenter<WatchDeviceContract.View>(),WatchDeviceContract.Presenter {
+
+
+    /**
+     *获取当前设备数据api
+     */
+    @Inject
+    protected lateinit var registerDeviceApi: RegisterDeviceApi
+
+    /**
+     *依赖注入初始化
+     */
+    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 DeviceDO)
+        }
+
+        override fun onErrorWithConnection(error: ExceptionHandle.ResponeThrowable, connectionQuality: ConnectionQuality) {
+            providerView().onError(error.customMessage)
+        }
+
+        override fun attachSubscribe(var1: Disposable) {
+        addDisposable(var1)
+        }
+
+    }
+
+    /**
+     *获取当前设备数据
+     */
+    override fun loadData(eth_mac:String) {
+
+        registerDeviceApi.getDeviceMessage(eth_mac).map {
+            var deviceDO = DeviceDO()
+
+            var gson = GsonBuilder().setFieldNamingPolicy(FieldNamingPolicy.LOWER_CASE_WITH_UNDERSCORES).create()
+            deviceDO = gson.fromJson(it.getJsonString(), DeviceDO::class.java)
+          return@map deviceDO
+        }
+                .compose(ThreadFromUtils.defaultSchedulers())
+                .subscribe(observable)
+
+    }
+}

+ 53 - 0
middleware/src/main/code/com/wdkl/ncs/android/middleware/logic/presenter/home/WatchHomeActivityPresenter.kt

@@ -0,0 +1,53 @@
+package com.wdkl.ncs.android.middleware.logic.presenter.home
+
+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.ConnectionObserver
+import com.wdkl.ncs.android.lib.utils.arrayObjects
+import com.wdkl.ncs.android.lib.utils.toJsonObject
+import com.wdkl.ncs.android.lib.utils.valueJsonArray
+import com.wdkl.ncs.android.middleware.api.DeviceApi
+import com.wdkl.ncs.android.middleware.di.MiddlewareDaggerComponent
+import com.wdkl.ncs.android.middleware.logic.contract.home.WatchActivityContract
+import com.wdkl.ncs.android.middleware.logic.contract.home.WatchHomeActivityContract
+import com.wdkl.ncs.android.middleware.model.vo.WatchContactsVO
+import io.reactivex.disposables.Disposable
+import javax.inject.Inject
+
+class WatchHomeActivityPresenter @Inject constructor(): RxPresenter<WatchHomeActivityContract.View>(),WatchHomeActivityContract.Presenter{
+
+
+    override fun bindDagger() {
+        MiddlewareDaggerComponent.component.inject(this)
+    }
+
+
+    private val observer = object : ConnectionObserver<Any>(){
+        override fun onStartWithConnection() {
+            providerView().start()
+        }
+
+        override fun onNextWithConnection(result: Any, connectionQuality: ConnectionQuality) {
+            providerView().complete()
+            providerView().render()
+        }
+
+        override fun onErrorWithConnection(error: ExceptionHandle.ResponeThrowable, connectionQuality: ConnectionQuality) {
+            providerView().onError(error.customMessage)
+        }
+
+        override fun attachSubscribe(var1: Disposable) {
+            addDisposable(var1)
+        }
+    }
+
+
+    override fun loadData() {
+
+
+    }
+}

+ 365 - 0
middleware/src/main/code/com/wdkl/ncs/android/middleware/model/dos/InteractionDO.java

@@ -0,0 +1,365 @@
+package com.wdkl.ncs.android.middleware.model.dos;
+
+import com.fasterxml.jackson.databind.PropertyNamingStrategy;
+import com.fasterxml.jackson.databind.annotation.JsonNaming;
+import com.wdkl.ncs.android.middleware.model.annotation.Column;
+import com.wdkl.ncs.android.middleware.model.annotation.Id;
+import com.wdkl.ncs.android.middleware.model.annotation.PrimaryKeyField;
+import com.wdkl.ncs.android.middleware.model.annotation.Table;
+
+import java.io.Serializable;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+
+@Table(name = "ncs_interaction")
+@ApiModel
+@JsonNaming(value = PropertyNamingStrategy.SnakeCaseStrategy.class)
+public class InteractionDO implements Serializable {
+
+    /**
+     * id
+     */
+    @Column(name = "id")
+    @ApiModelProperty(value = "id", required = false)
+    @Id(name = "id")
+    private Integer id;
+    /**
+     * union_id,线下线上同步ID
+     */
+    @Column(name = "union_id")
+    @ApiModelProperty(value = "union_id,线下线上同步ID", required = false)
+    private String unionId;
+    /**
+     * 创建时间
+     */
+    @Column(name = "create_date")
+    @ApiModelProperty(value = "创建时间", required = false)
+    private Long createDate;
+    /**
+     * 科室Id
+     */
+    @Column(name = "part_id")
+    @ApiModelProperty(value = "科室Id", required = false)
+    private Integer partId;
+    /**
+     * 交互类型(1:语音通话,2:视频通话,3:卫生间紧急呼叫,4:语音留言,5:文本消息,6:按键事件)
+     */
+    @Column(name = "action_type")
+    @ApiModelProperty(value = "交互类型(1:语音通话,2:视频通话,3:卫生间紧急呼叫,4:语音留言,5:文本消息,6:按键事件)", required = false)
+    private String actionType;
+    /**
+     * SUCCESS、FAILED
+     */
+    @Column(name = "action_result")
+    @ApiModelProperty(value = "0失败,1成功", required = false)
+    private Integer actionResult;
+    /**
+     * 交互发起设备Id
+     */
+    @Column(name = "from_device_id")
+    @ApiModelProperty(value = "交互发起设备Id", required = false)
+    private Integer fromDeviceId;
+    /**
+     * 交互对象设备Id
+     */
+    @Column(name = "to_device_id")
+    @ApiModelProperty(value = "交互对象设备Id", required = false)
+    private Integer toDeviceId;
+    /**
+     * 发起设备所在空间结构
+     */
+    @Column(name = "from_device_frame_id")
+    @ApiModelProperty(value = "发起设备所在空间结构", required = false)
+    private Integer fromDeviceFrameId;
+    /**
+     * 交互对象所在空间结果
+     */
+    @Column(name = "to_device_frame_id")
+    @ApiModelProperty(value = "交互对象所在空间结果", required = false)
+    private Integer toDeviceFrameId;
+    /**
+     * 交互发起设备使用者member_id
+     */
+    @Column(name = "from_device_member_id")
+    @ApiModelProperty(value = "交互发起设备使用者member_id", required = false)
+    private Integer fromDeviceMemberId;
+    /**
+     * 交互对象设备使用者member_id
+     */
+    @Column(name = "to_device_member_id")
+    @ApiModelProperty(value = "交互对象设备使用者member_id", required = false)
+    private Integer toDeviceMemberId;
+    /**
+     * 是否为呼叫系统内部交互(如果是外部电话呼叫为true,否则为false)
+     */
+    @Column(name = "outerior_action")
+    @ApiModelProperty(value = "是否为呼叫系统内部交互(如果是外部电话呼叫为true,否则为false)", required = false)
+    private Boolean outeriorAction;
+    /**
+     * 外部呼叫时的来电号码(根据此号码查询member,并设置from_device信息)
+     */
+    @Column(name = "outerior_action_number")
+    @ApiModelProperty(value = "外部呼叫时的来电号码(根据此号码查询member,并设置from_device信息)", required = false)
+    private String outeriorActionNumber;
+    /**
+     * 外部交互者的用户id
+     */
+    @Column(name = "outerior_action_member_id")
+    @ApiModelProperty(value = "外部交互者的用户id", required = false)
+    private Long outeriorActionMemberId;
+    /**
+     * 备注Id
+     */
+    @Column(name = "remark_id")
+    @ApiModelProperty(value = "备注Id", required = false)
+    private Integer remarkId;
+    /**
+     * 交互开始时间(通话时指通话接通时间,与create_time相同)
+     */
+    @Column(name = "action_start")
+    @ApiModelProperty(value = "交互开始时间(通话时指通话接通时间,与create_time相同)", required = false)
+    private Long actionStart;
+    /**
+     * 应答时间
+     */
+    @Column(name = "action_accept")
+    @ApiModelProperty(value = "应答时间", required = false)
+    private Long actionAccept;
+    /**
+     * 交互结束时间(通话时指通话挂断时间,通话挂断后要更新此字段)。事件响应时间、语音已读时间
+     */
+    @Column(name = "action_end")
+    @ApiModelProperty(value = "交互结束时间(通话时指通话挂断时间,通话挂断后要更新此字段)。事件响应时间、语音已读时间", required = false)
+    private Long actionEnd;
+    /**
+     * 交互数据(类型1,2,3为空)(类型4为音频文件地址)(5为文本内容)(类型6为具体按键类型)
+     */
+    @Column(name = "data")
+    @ApiModelProperty(value = "交互数据(类型1,2,3为空)(类型4为音频文件地址)(5为文本内容)(类型6为具体按键类型)", required = false)
+    private String data;
+    /**
+     * 交互错误代码
+     */
+    @Column(name = "error_code")
+    @ApiModelProperty(value = "交互错误代码", required = false)
+    private String errorCode;
+    /**
+     * 交互错误描述
+     */
+    @Column(name = "error_message")
+    @ApiModelProperty(value = "交互错误描述", required = false)
+    private String errorMessage;
+
+    @Column(name = "action_direction_type")
+    @ApiModelProperty(value = "交互方向类型(1:分机到主机、腕表、医生机,2:主机、腕表、医生机到分机,3主机、腕表、医生机之间互通,4:分机到分机)",required = false)
+    private Integer actionDirectionType;
+
+
+    @PrimaryKeyField
+    public Integer getId() {
+        return id;
+    }
+
+    public void setId(Integer id) {
+        this.id = id;
+    }
+
+
+    public String getUnionId() {
+        return unionId;
+    }
+
+    public void setUnionId(String unionId) {
+        this.unionId = unionId;
+    }
+
+
+    public Long getCreateDate() {
+        return createDate;
+    }
+
+    public void setCreateDate(Long createDate) {
+        this.createDate = createDate;
+    }
+
+
+    public Integer getPartId() {
+        return partId;
+    }
+
+    public void setPartId(Integer partId) {
+        this.partId = partId;
+    }
+
+
+    public String getActionType() {
+        return actionType;
+    }
+
+    public void setActionType(String actionType) {
+        this.actionType = actionType;
+    }
+
+
+    public Integer getActionResult() {
+        return actionResult;
+    }
+
+    public void setActionResult(Integer actionResult) {
+        this.actionResult = actionResult;
+    }
+
+
+    public Integer getFromDeviceId() {
+        return fromDeviceId;
+    }
+
+    public void setFromDeviceId(Integer fromDeviceId) {
+        this.fromDeviceId = fromDeviceId;
+    }
+
+
+    public Integer getToDeviceId() {
+        return toDeviceId;
+    }
+
+    public void setToDeviceId(Integer toDeviceId) {
+        this.toDeviceId = toDeviceId;
+    }
+
+
+    public Integer getFromDeviceFrameId() {
+        return fromDeviceFrameId;
+    }
+
+    public void setFromDeviceFrameId(Integer fromDeviceFrameId) {
+        this.fromDeviceFrameId = fromDeviceFrameId;
+    }
+
+
+    public Integer getToDeviceFrameId() {
+        return toDeviceFrameId;
+    }
+
+    public void setToDeviceFrameId(Integer toDeviceFrameId) {
+        this.toDeviceFrameId = toDeviceFrameId;
+    }
+
+
+    public Integer getFromDeviceMemberId() {
+        return fromDeviceMemberId;
+    }
+
+    public void setFromDeviceMemberId(Integer fromDeviceMemberId) {
+        this.fromDeviceMemberId = fromDeviceMemberId;
+    }
+
+
+    public Integer getToDeviceMemberId() {
+        return toDeviceMemberId;
+    }
+
+    public void setToDeviceMemberId(Integer toDeviceMemberId) {
+        this.toDeviceMemberId = toDeviceMemberId;
+    }
+
+
+    public Boolean getOuteriorAction() {
+        return outeriorAction;
+    }
+
+    public void setOuteriorAction(Boolean outeriorAction) {
+        this.outeriorAction = outeriorAction;
+    }
+
+
+    public String getOuteriorActionNumber() {
+        return outeriorActionNumber;
+    }
+
+    public void setOuteriorActionNumber(String outeriorActionNumber) {
+        this.outeriorActionNumber = outeriorActionNumber;
+    }
+
+
+    public Long getOuteriorActionMemberId() {
+        return outeriorActionMemberId;
+    }
+
+    public void setOuteriorActionMemberId(Long outeriorActionMemberId) {
+        this.outeriorActionMemberId = outeriorActionMemberId;
+    }
+
+
+    public Integer getRemarkId() {
+        return remarkId;
+    }
+
+    public void setRemarkId(Integer remarkId) {
+        this.remarkId = remarkId;
+    }
+
+
+    public Long getActionStart() {
+        return actionStart;
+    }
+
+    public void setActionStart(Long actionStart) {
+        this.actionStart = actionStart;
+    }
+
+
+    public Long getActionAccept() {
+        return actionAccept;
+    }
+
+    public void setActionAccept(Long actionAccept) {
+        this.actionAccept = actionAccept;
+    }
+
+
+    public Long getActionEnd() {
+        return actionEnd;
+    }
+
+    public void setActionEnd(Long actionEnd) {
+        this.actionEnd = actionEnd;
+    }
+
+
+    public String getData() {
+        return data;
+    }
+
+    public void setData(String data) {
+        this.data = data;
+    }
+
+
+    public String getErrorCode() {
+        return errorCode;
+    }
+
+    public void setErrorCode(String errorCode) {
+        this.errorCode = errorCode;
+    }
+
+
+    public String getErrorMessage() {
+        return errorMessage;
+    }
+
+    public void setErrorMessage(String errorMessage) {
+        this.errorMessage = errorMessage;
+    }
+
+    public Integer getActionDirectionType() {
+        return actionDirectionType;
+    }
+
+    public void setActionDirectionType(Integer actionDirectionType) {
+        this.actionDirectionType = actionDirectionType;
+    }
+
+}

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

@@ -0,0 +1,350 @@
+package com.wdkl.ncs.android.middleware.model.vo;
+
+
+import com.wdkl.ncs.android.middleware.model.annotation.Column;
+import com.wdkl.ncs.android.middleware.model.dos.InteractionDO;
+
+import io.swagger.annotations.ApiModelProperty;
+
+/**
+ * @program nc
+ * @description:
+ * @author: Vothin
+ * @create: 2021/04/02 15:27
+ */
+
+public class InteractionVO extends InteractionDO {
+
+    /** 用户 **/
+    @Column(name = "from_customer_id")
+    @ApiModelProperty(value = "发起端用户CustomId", required = false)
+    private Integer fromCustomerId;
+
+    @Column(name = "from_member_name")
+    @ApiModelProperty(value = "发起端用户姓名", required = false)
+    private String fromMemberName;
+
+    @Column(name = "from_member_face")
+    @ApiModelProperty(value = "发起端用户头像", required = false)
+    private String fromMemberFace;
+
+    @Column(name = "from_clerk_id")
+    @ApiModelProperty(value = "发起端用户成员Id,发起端为护士主机,腕表,医生机时才有", required = false)
+    private Integer fromClerkId;
+
+    @Column(name = "from_role_name")
+    @ApiModelProperty(value = "发起端用户角色名(医生、护士、护工)", required = false)
+    private String fromRoleName;
+
+
+    @Column(name = "to_customer_id")
+    @ApiModelProperty(value = "目的端用户CustomId", required = false)
+    private Integer toCustomerId;
+
+    @Column(name = "to_member_name")
+    @ApiModelProperty(value = "目的端用户姓名", required = false)
+    private String toMemberName;
+
+    @Column(name = "to_member_face")
+    @ApiModelProperty(value = "目的端用户头像", required = false)
+    private String toMemberFace;
+
+    @Column(name = "to_clerk_id")
+    @ApiModelProperty(value = "目的端用户成员Id,目的端为护士主机,腕表,医生机时才有", required = false)
+    private Integer toClerkId;
+
+    @Column(name = "to_role_name")
+    @ApiModelProperty(value = "目的端用户角色名(医生、护士、护工)", required = false)
+    private String toRoleName;
+
+
+    /** 设备 **/
+    @Column(name = "from_eth_mac")
+    @ApiModelProperty(value = "发起端设备的有线以太网卡MAC地址", required = false)
+    private String fromEthMac;
+
+    @Column(name = "from_eth_ip")
+    @ApiModelProperty(value = "发起端设备的有线以太网卡分配的IP地址", required = false)
+    private String fromEthIp;
+
+
+    @Column(name = "from_sip_id")
+    @ApiModelProperty(value = "发起端设备的SIP账号", required = false)
+    private String fromSipId;
+
+
+    @Column(name = "to_eth_mac")
+    @ApiModelProperty(value = "目的端设备的有线以太网卡MAC地址", required = false)
+    private String toEthMac;
+
+    @Column(name = "to_eth_ip")
+    @ApiModelProperty(value = "目的端设备的有线以太网卡分配的IP地址", required = false)
+    private String toEthIp;
+
+
+    @Column(name = "to_sip_id")
+    @ApiModelProperty(value = "目的端设备的SIP账号", required = false)
+    private String toSipId;
+
+    /** 空间结构 **/
+
+    @Column(name = "from_frame_type")
+    @ApiModelProperty(value = "发起端空间结构类型:0楼、1病房、2床位", required = false)
+    private Integer fromFrameType;
+
+
+    @Column(name = "from_frame_name")
+    @ApiModelProperty(value = "发起端空间结构名称", required = false)
+    private String fromFrameName;
+
+    @Column(name = "from_frame_full_name")
+    @ApiModelProperty(value = "发起端空间结构全名", required = false)
+    private String fromFrameFullName;
+
+
+    @Column(name = "to_frame_type")
+    @ApiModelProperty(value = "目的端空间结构类型:0楼、1病房、2床位", required = false)
+    private Integer toFrameType;
+
+
+    @Column(name = "to_frame_name")
+    @ApiModelProperty(value = "目的端空间结构名称", required = false)
+    private String toFrameName;
+
+    @Column(name = "to_frame_full_name")
+    @ApiModelProperty(value = "发起端空间结构全名", required = false)
+    private String toFrameFullName;
+
+
+
+    @Column(name = "relative_id")
+    @ApiModelProperty(value = "亲属id,外部来电时,from_member亲属的memberId", required = false)
+    private Integer relativeId;
+
+    @Column(name = "relative_name")
+    @ApiModelProperty(value = "外部来电时,from_member亲属名字", required = false)
+    private String relativeName;
+
+
+    public Integer getFromCustomerId() {
+        return fromCustomerId;
+    }
+
+    public void setFromCustomerId(Integer fromCustomerId) {
+        this.fromCustomerId = fromCustomerId;
+    }
+
+    public String getFromMemberName() {
+        return fromMemberName;
+    }
+
+    public void setFromMemberName(String fromMemberName) {
+        this.fromMemberName = fromMemberName;
+    }
+
+    public String getFromMemberFace() {
+        return fromMemberFace;
+    }
+
+    public void setFromMemberFace(String fromMemberFace) {
+        this.fromMemberFace = fromMemberFace;
+    }
+
+    public Integer getFromClerkId() {
+        return fromClerkId;
+    }
+
+    public void setFromClerkId(Integer fromClerkId) {
+        this.fromClerkId = fromClerkId;
+    }
+
+    public String getFromRoleName() {
+        return fromRoleName;
+    }
+
+    public void setFromRoleName(String fromRoleName) {
+        this.fromRoleName = fromRoleName;
+    }
+
+    public Integer getToCustomerId() {
+        return toCustomerId;
+    }
+
+    public void setToCustomerId(Integer toCustomerId) {
+        this.toCustomerId = toCustomerId;
+    }
+
+    public String getToMemberName() {
+        return toMemberName;
+    }
+
+    public void setToMemberName(String toMemberName) {
+        this.toMemberName = toMemberName;
+    }
+
+    public String getToMemberFace() {
+        return toMemberFace;
+    }
+
+    public void setToMemberFace(String toMemberFace) {
+        this.toMemberFace = toMemberFace;
+    }
+
+    public Integer getToClerkId() {
+        return toClerkId;
+    }
+
+    public void setToClerkId(Integer toClerkId) {
+        this.toClerkId = toClerkId;
+    }
+
+    public String getToRoleName() {
+        return toRoleName;
+    }
+
+    public void setToRoleName(String toRoleName) {
+        this.toRoleName = toRoleName;
+    }
+
+    public String getFromEthMac() {
+        return fromEthMac;
+    }
+
+    public void setFromEthMac(String fromEthMac) {
+        this.fromEthMac = fromEthMac;
+    }
+
+    public String getFromEthIp() {
+        return fromEthIp;
+    }
+
+    public void setFromEthIp(String fromEthIp) {
+        this.fromEthIp = fromEthIp;
+    }
+
+    public String getFromSipId() {
+        return fromSipId;
+    }
+
+    public void setFromSipId(String fromSipId) {
+        this.fromSipId = fromSipId;
+    }
+
+    public String getToEthMac() {
+        return toEthMac;
+    }
+
+    public void setToEthMac(String toEthMac) {
+        this.toEthMac = toEthMac;
+    }
+
+    public String getToEthIp() {
+        return toEthIp;
+    }
+
+    public void setToEthIp(String toEthIp) {
+        this.toEthIp = toEthIp;
+    }
+
+    public String getToSipId() {
+        return toSipId;
+    }
+
+    public void setToSipId(String toSipId) {
+        this.toSipId = toSipId;
+    }
+
+    public Integer getFromFrameType() {
+        return fromFrameType;
+    }
+
+    public void setFromFrameType(Integer fromFrameType) {
+        this.fromFrameType = fromFrameType;
+    }
+
+    public String getFromFrameName() {
+        return fromFrameName;
+    }
+
+    public void setFromFrameName(String fromFrameName) {
+        this.fromFrameName = fromFrameName;
+    }
+
+    public String getFromFrameFullName() {
+        return fromFrameFullName;
+    }
+
+    public void setFromFrameFullName(String fromFrameFullName) {
+        this.fromFrameFullName = fromFrameFullName;
+    }
+
+    public Integer getToFrameType() {
+        return toFrameType;
+    }
+
+    public void setToFrameType(Integer toFrameType) {
+        this.toFrameType = toFrameType;
+    }
+
+    public String getToFrameName() {
+        return toFrameName;
+    }
+
+    public void setToFrameName(String toFrameName) {
+        this.toFrameName = toFrameName;
+    }
+
+    public String getToFrameFullName() {
+        return toFrameFullName;
+    }
+
+    public void setToFrameFullName(String toFrameFullName) {
+        this.toFrameFullName = toFrameFullName;
+    }
+
+    public Integer getRelativeId() {
+        return relativeId;
+    }
+
+    public void setRelativeId(Integer relativeId) {
+        this.relativeId = relativeId;
+    }
+
+    public String getRelativeName() {
+        return relativeName;
+    }
+
+    public void setRelativeName(String relativeName) {
+        this.relativeName = relativeName;
+    }
+
+    @Override
+    public String toString() {
+        return "InteractionVO{" +
+                "fromCustomerId=" + fromCustomerId +
+                ", fromMemberName='" + fromMemberName + '\'' +
+                ", fromMemberFace='" + fromMemberFace + '\'' +
+                ", fromClerkId=" + fromClerkId +
+                ", fromRoleName='" + fromRoleName + '\'' +
+                ", toCustomerId=" + toCustomerId +
+                ", toMemberName='" + toMemberName + '\'' +
+                ", toMemberFace='" + toMemberFace + '\'' +
+                ", toClerkId=" + toClerkId +
+                ", toRoleName='" + toRoleName + '\'' +
+                ", fromEthMac='" + fromEthMac + '\'' +
+                ", fromEthIp='" + fromEthIp + '\'' +
+                ", fromSipId='" + fromSipId + '\'' +
+                ", toEthMac='" + toEthMac + '\'' +
+                ", toEthIp='" + toEthIp + '\'' +
+                ", toSipId='" + toSipId + '\'' +
+                ", fromFrameType=" + fromFrameType +
+                ", fromFrameName='" + fromFrameName + '\'' +
+                ", fromFrameFullName='" + fromFrameFullName + '\'' +
+                ", toFrameType=" + toFrameType +
+                ", toFrameName='" + toFrameName + '\'' +
+                ", toFrameFullName='" + toFrameFullName + '\'' +
+                ", relativeId=" + relativeId +
+                ", relativeName='" + relativeName + '\'' +
+                '}';
+    }
+}

+ 99 - 28
middleware/src/main/code/com/wdkl/ncs/android/middleware/model/vo/WatchContactsVO.java

@@ -1,53 +1,124 @@
 package com.wdkl.ncs.android.middleware.model.vo;
 
-import java.io.Serializable;
+import com.wdkl.ncs.android.middleware.model.annotation.Column;
 
+import io.swagger.annotations.ApiModelProperty;
 
-public class WatchContactsVO implements Serializable {
-    //nd.id,nd.sip_id,nf.type,nf.name,nf.alias,nf.full_name,nc.named
-    private Integer id;
-    private String sipId;
-    private String type;
-    private String fullName;
-    private String named;
+/**
+ * @program nc
+ * @description:
+ * @author: Vothin
+ * @create: 2021/04/07 16:30
+ */
 
-    public Integer getId() {
-        return id;
+public class WatchContactsVO {
+
+    @Column(name = "device_id")
+    @ApiModelProperty(name = "device_id", value = "设备id", hidden = false)
+    private Integer deviceId;
+
+    @Column(name = "device_sip_id")
+    @ApiModelProperty(name = "device_sip_id", value = "设备sip_id", hidden = false)
+    private String deviceSipId;
+
+    @Column(name = "device_eth_ip")
+    @ApiModelProperty(name = "device_eth_ip", value = "设备eth_ip", hidden = false)
+    private String deviceEthIp;
+
+    @Column(name = "frame_type")
+    @ApiModelProperty(name = "frame_type", value = "空间类型", hidden = false)
+    private Integer frameType;
+
+    @Column(name = "frame_name")
+    @ApiModelProperty(name = "frame_name", value = "空间名", hidden = false)
+    private String frameName;
+
+    @Column(name = "frame_alias")
+    @ApiModelProperty(name = "frame_alias", value = "空间别名", hidden = false)
+    private String frameAlias;
+
+    @Column(name = "frame_full_name")
+    @ApiModelProperty(name = "frame_full_name", value = "空间全名", hidden = false)
+    private String frameFullName;
+
+    @Column(name = "customer_named")
+    @ApiModelProperty(name = "customer_named", value = "病人名称", hidden = false)
+    private String customerNamed;
+
+    @Column(name = "customer_id")
+    @ApiModelProperty(name = "customer_id", value = "病人id", hidden = false)
+    private Integer customerId;
+
+    public Integer getDeviceId() {
+        return deviceId;
+    }
+
+    public void setDeviceId(Integer deviceId) {
+        this.deviceId = deviceId;
+    }
+
+    public String getDeviceSipId() {
+        return deviceSipId;
     }
 
-    public void setId(Integer id) {
-        this.id = id;
+    public void setDeviceSipId(String deviceSipId) {
+        this.deviceSipId = deviceSipId;
     }
 
-    public String getSipId() {
-        return sipId;
+    public String getDeviceEthIp() {
+        return deviceEthIp;
     }
 
-    public void setSipId(String sipId) {
-        this.sipId = sipId;
+    public void setDeviceEthIp(String deviceEthIp) {
+        this.deviceEthIp = deviceEthIp;
     }
 
-    public String getType() {
-        return type;
+    public Integer getFrameType() {
+        return frameType;
     }
 
-    public void setType(String type) {
-        this.type = type;
+    public void setFrameType(Integer frameType) {
+        this.frameType = frameType;
     }
 
-    public String getFullName() {
-        return fullName;
+    public String getFrameName() {
+        return frameName;
     }
 
-    public void setFullName(String fullName) {
-        this.fullName = fullName;
+    public void setFrameName(String frameName) {
+        this.frameName = frameName;
     }
 
-    public String getNamed() {
-        return named;
+    public String getFrameAlias() {
+        return frameAlias;
     }
 
-    public void setNamed(String named) {
-        this.named = named;
+    public void setFrameAlias(String frameAlias) {
+        this.frameAlias = frameAlias;
+    }
+
+    public String getFrameFullName() {
+        return frameFullName;
+    }
+
+    public void setFrameFullName(String frameFullName) {
+        this.frameFullName = frameFullName;
+    }
+
+    public String getCustomerNamed() {
+        return customerNamed;
+    }
+
+    public void setCustomerNamed(String customerNamed) {
+        this.customerNamed = customerNamed;
+    }
+
+    public Integer getCustomerId() {
+        return customerId;
+    }
+
+    public void setCustomerId(Integer customerId) {
+        this.customerId = customerId;
     }
 }
+

+ 43 - 26
middleware/src/main/code/com/wdkl/ncs/android/middleware/tcp/TcpClient.java

@@ -1,81 +1,97 @@
 package com.wdkl.ncs.android.middleware.tcp;
 
+import android.util.Log;
+
+import java.util.Scanner;
+import java.util.concurrent.TimeUnit;
+
 import io.netty.bootstrap.Bootstrap;
 import io.netty.channel.*;
 import io.netty.channel.nio.NioEventLoopGroup;
 import io.netty.channel.socket.SocketChannel;
 import io.netty.channel.socket.nio.NioSocketChannel;
+import io.netty.handler.codec.LengthFieldBasedFrameDecoder;
+import io.netty.handler.codec.LengthFieldPrepender;
 import io.netty.handler.codec.string.StringDecoder;
 import io.netty.handler.codec.string.StringEncoder;
 import io.netty.handler.timeout.IdleStateHandler;
 import io.netty.util.CharsetUtil;
 
-import java.util.Scanner;
-import java.util.concurrent.TimeUnit;
-
 //单例
 public class TcpClient {
+    private String TAG = TcpClient.class.getSimpleName();
+
     private NioEventLoopGroup workGroup = new NioEventLoopGroup();
+    public Channel channel;
     private Bootstrap bootstrap;
 
     //数据处理
     TcpClientHandler tcpClientHandler = new TcpClientHandler();
-    //是否运行中
-    public boolean isRunning = false;
     //重试间隔
-    private Integer retrySeconds = 5;
+    private Integer retrySeconds = 2;
     //重试计数
     private Integer retryTimes = 1;
 
 
     //单例
-    private static class TcpClientHolder{
+    private static class TcpClientHolder {
         private static TcpClient instance = new TcpClient();
     }
 
-    public static TcpClient getInstance(){
+    public static TcpClient getInstance() {
         return TcpClientHolder.instance;
     }
 
     //初始化Netty Tcp Client 并连接
-    public void init(String serverIP, Integer serverPort, Integer heartBeatSeconds){
+    public void init(String serverIP, Integer serverPort, Integer heartBeatSeconds) {
         final Integer hbSeconds = heartBeatSeconds;
         bootstrap = new Bootstrap();
         bootstrap.group(workGroup)
                 .channel(NioSocketChannel.class)
-                .option(ChannelOption.SO_KEEPALIVE,true)
+                .option(ChannelOption.CONNECT_TIMEOUT_MILLIS, 15 * 1000)
+                .option(ChannelOption.SO_KEEPALIVE, true)
                 .handler(new ChannelInitializer<SocketChannel>() {
                     @Override
                     protected void initChannel(SocketChannel socketChannel) throws Exception {
+                        // 这里将LengthFieldBasedFrameDecoder添加到pipeline的首位,因为其需要对接收到的数据
+                        // 进行长度字段解码,这里也会对数据进行粘包和拆包处理
+                        socketChannel.pipeline().addLast(new LengthFieldBasedFrameDecoder(1024, 0, 2, 0, 2));
+                        // LengthFieldPrepender是一个编码器,主要是在响应字节数据前面添加字节长度字段
+                        socketChannel.pipeline().addLast(new LengthFieldPrepender(2));
                         //心跳包应当小于服务器间隔
-                        socketChannel.pipeline().addLast(new IdleStateHandler(0, 9,0, TimeUnit.SECONDS));
+                        socketChannel.pipeline().addLast(new IdleStateHandler(0, 9, 0, TimeUnit.SECONDS));
                         socketChannel.pipeline().addLast(new StringDecoder(CharsetUtil.UTF_8));
                         socketChannel.pipeline().addLast(new StringEncoder(CharsetUtil.UTF_8));
                         socketChannel.pipeline().addLast(tcpClientHandler);
                     }
-                }).remoteAddress(serverIP,serverPort);
+                }).remoteAddress(serverIP, serverPort);
         doConnect();
     }
 
     //独立连接方法,用于重新连接
-    public synchronized void doConnect(){
-        System.out.println("connect start");
+    public synchronized void doConnect() {
+        if (channel != null && channel.isActive()) {
+            System.out.println("TcpClient connecting");
+            return;
+        }
+
+        System.out.println("TcpClient connect start");
         ChannelFuture future = bootstrap.connect().addListener(new ChannelFutureListener() {
             @Override
             public void operationComplete(ChannelFuture channelFuture) throws Exception {
-                if (channelFuture.isSuccess()){
-                    isRunning = true;
-                    System.out.println("connect success");
+                if (channelFuture.isSuccess()) {
+                    channel = channelFuture.channel();
+                    retryTimes = 0;
+                    System.out.println("TcpClient connect success");
                 } else {
                     //连接失败时的处理
-                    isRunning = false;
-                    System.out.println("connect retry : " + retryTimes);
+                    System.out.println("TcpClient connect retry : " + retryTimes);
                     channelFuture.channel().eventLoop().schedule(new Runnable() {
                         @Override
                         public void run() {
                             retryTimes++;
-                            if (retryTimes>3){
-                                System.out.println("重试"+(retryTimes-1)+"次,结束");
+                            if (retryTimes > 30) {
+                                System.out.println("TcpClient 重试" + (retryTimes - 1) + "次,结束");
                                 workGroup.shutdownGracefully();
                                 //todo: 从API获取新的serverIP和serverPort,全新连接
                                 //TcpClient.getInstance().init();
@@ -83,7 +99,7 @@ public class TcpClient {
                             }
                             doConnect();
                         }
-                    },retrySeconds * retryTimes, TimeUnit.SECONDS);
+                    }, retrySeconds * retryTimes, TimeUnit.SECONDS);
                 }
             }
         });
@@ -93,7 +109,7 @@ public class TcpClient {
 //        } catch (InterruptedException e) {
 //            e.printStackTrace();
 //        } finally {
-            //重试之前不关
+        //重试之前不关
 //            try {
 //                Thread.sleep(retrySeconds * retryTimes*1000 + 1000);
 //            } catch (InterruptedException e) {
@@ -103,7 +119,8 @@ public class TcpClient {
     }
 
     //发送消息,线程安全
-    public synchronized void sendMsg(String content){
+    public synchronized void sendMsg(String content) {
+        Log.e(TAG, "发送的数据 " + content);
         tcpClientHandler.sendMsg(content);
     }
 
@@ -113,12 +130,12 @@ public class TcpClient {
         new Thread(new Runnable() {
             @Override
             public void run() {
-                TcpClient.getInstance().init("192.168.1.100",5080, 9);
+                TcpClient.getInstance().init("192.168.1.188", 5080, 9);
             }
         }).start();
 
         Scanner scanner = new Scanner(System.in);
-        while (true){
+        while (true) {
             System.out.println("please type : ");
             String line = scanner.nextLine();
             TcpClient.getInstance().sendMsg(line);

+ 18 - 11
middleware/src/main/code/com/wdkl/ncs/android/middleware/tcp/TcpClientHandler.java

@@ -1,8 +1,14 @@
 package com.wdkl.ncs.android.middleware.tcp;
 
+import android.util.Log;
+
+import com.wdkl.ncs.android.component.nursehome.common.Constants;
 import com.wdkl.ncs.android.middleware.tcp.channel.DeviceChannel;
+import com.wdkl.ncs.android.middleware.tcp.channel.DeviceUtil;
 import com.wdkl.ncs.android.middleware.tcp.dto.TcpModel;
 
+import java.util.concurrent.TimeUnit;
+
 import io.netty.buffer.Unpooled;
 import io.netty.channel.ChannelHandler;
 import io.netty.channel.ChannelHandlerContext;
@@ -12,8 +18,6 @@ import io.netty.handler.timeout.IdleStateEvent;
 import io.netty.util.CharsetUtil;
 import io.netty.util.ReferenceCountUtil;
 
-import java.util.concurrent.TimeUnit;
-
 @ChannelHandler.Sharable
 public class TcpClientHandler extends SimpleChannelInboundHandler<String> {
     ChannelHandlerContext ctx;
@@ -30,9 +34,12 @@ public class TcpClientHandler extends SimpleChannelInboundHandler<String> {
     @Override
     public void channelActive(ChannelHandlerContext ctx) throws Exception {
         super.channelActive(ctx);
+        System.out.println("tcp连接成功");
         this.ctx = ctx;
         connected = true;
         retryTimes = 0;
+        TcpModel tcpModel = DeviceUtil.deviceConnect(Constants.Companion.getMac());
+        TcpClient.getInstance().sendMsg(tcpModel.toJson());
     }
 
     //断开连接
@@ -40,14 +47,14 @@ public class TcpClientHandler extends SimpleChannelInboundHandler<String> {
     public void channelInactive(ChannelHandlerContext ctx) throws Exception {
         super.channelInactive(ctx);
         connected = false;
-        System.out.println("失去连接");
+        System.out.println("TcpClientHandler 失去连接");
         reConnect(ctx);
     }
 
     //读取String消息
     @Override
     protected void channelRead0(ChannelHandlerContext ctx, String source) throws Exception {
-        //System.out.println("channelRead0: read callback from server ===> " + source);
+        System.out.println("TcpClientHandler from server ===> " + source);
         TcpModel tcpModel = TcpModel.getModelByJson(source);
 
         TcpModel responseTcpModel = DeviceChannel.handleTcpReceived(tcpModel);
@@ -74,7 +81,7 @@ public class TcpClientHandler extends SimpleChannelInboundHandler<String> {
         cause.printStackTrace();
         ctx.close();
         connected = false;
-        System.out.println("失去连接,错误引起");
+        System.out.println("TcpClientHandler 失去连接,错误引起");
     }
 
     //发送消息,不直接调用些方法,调用TcpClient中的发送消息
@@ -94,18 +101,18 @@ public class TcpClientHandler extends SimpleChannelInboundHandler<String> {
 
     //已经连接上,中途失去连接时的处理
     private void reConnect(final ChannelHandlerContext ctx){
-        totalRetryTimes++;
-        System.out.println("总计连接次数:"+totalRetryTimes);
         if (totalRetryTimes>100){
             //todo: 存储数据库,并告警
         }
-        if (connected){
+        if (connected && (TcpClient.getInstance().channel != null && TcpClient.getInstance().channel.isActive())){
             return;
         }
+        totalRetryTimes++;
+        System.out.println("TcpClientHandler 总计连接次数:"+totalRetryTimes);
         retryTimes++;
-        if (retryTimes>3){
+        if (retryTimes>30){
             //超时3次,其它处理
-            System.out.println("重新连接"+(retryTimes-1)+"次,结束");
+            System.out.println("TcpClientHandler 重新连接"+(retryTimes-1)+"次,结束");
             retryTimes = 0;
             //todo: 从API获取新的serverIP和serverPort,全新连接
             //TcpClient.getInstance().init();
@@ -115,7 +122,7 @@ public class TcpClientHandler extends SimpleChannelInboundHandler<String> {
         ctx.channel().eventLoop().schedule(new Runnable() {
             @Override
             public void run() {
-                System.out.println("重新连接,第"+retryTimes+"次");
+                System.out.println("TcpClientHandler 重新连接,第"+retryTimes+"次");
                 TcpClient.getInstance().doConnect();
                 reConnect(ctx);
             }

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

@@ -1,68 +1,112 @@
 package com.wdkl.ncs.android.middleware.tcp.channel;
 
+import android.util.Log;
+
+import com.google.gson.Gson;
+import com.wdkl.ncs.android.middleware.model.vo.InteractionVO;
 import com.wdkl.ncs.android.middleware.tcp.dto.TcpModel;
 import com.wdkl.ncs.android.middleware.tcp.enums.TcpAction;
+import com.wdkl.ncs.android.middleware.utils.MessageEvent;
+
+import org.greenrobot.eventbus.EventBus;
 
 /**
  * 前提:所有安卓设备可以互相通话。
  * 在此前提下,所有安卓设备接收TCP信号的逻辑一致
  */
 public class DeviceChannel {
+    private static String TAG = DeviceChannel.class.getSimpleName();
+
     //通话中模拟
-    private static boolean calling = true;
+    public static boolean calling = false;
 
     public static TcpModel handleTcpReceived(TcpModel tcpModel){
         TcpModel responseTcpModel = null;
 
+        Log.e(TAG,"DeviceChannel "+tcpModel.getType());
+
         switch (tcpModel.getType()){
+            case CALLBACK:
+                if(tcpModel.getAction()== TcpAction.CallbackAction.SUCCESS){
+                    //todo: 刷新呼叫记录列表
+                    EventBus.getDefault().post(new MessageEvent(tcpModel,0));
+                }else if(tcpModel.getAction()== TcpAction.CallbackAction.FAILED){
+                    EventBus.getDefault().post(new MessageEvent(tcpModel,0));
+                }
+                break;
             case VOICE:
-                if (tcpModel.getAction()==TcpAction.VoiceAction.CALL){ //语音呼入
+                if (tcpModel.getAction()== TcpAction.VoiceAction.CALL){ //语音呼入
+                    InteractionVO interactionVO = new Gson().fromJson(tcpModel.getData().toString(), InteractionVO.class);
                     //todo: 判断当前是否通话
                     // 通话中
                     if (calling){
-                        responseTcpModel = VoiceUtil.voiceCalling(tcpModel.getToId(), tcpModel.getFromId());
+                        responseTcpModel = VoiceUtil.voiceCalling(tcpModel.getToId(), tcpModel.getFromId(),interactionVO.getId());
+                        //todo 给服务器发送正在通话中 tcp
                         return responseTcpModel;
                     } else {
-                        responseTcpModel = VoiceUtil.voiceSuccess(tcpModel.getToId(), tcpModel.getFromId());
+                        responseTcpModel = VoiceUtil.voiceSuccess(tcpModel.getToId(), tcpModel.getFromId(),interactionVO.getId());
                         //todo: 通话中界面展现,data中服务器传过来呼入名称;从接口重新获取左侧数据
+                        EventBus.getDefault().post(new MessageEvent(tcpModel,0));
                         return responseTcpModel;
                     }
-                } else if (tcpModel.getAction()==TcpAction.VoiceAction.ACCEPT){ //我方呼出,对方接受
+                } else if (tcpModel.getAction()== TcpAction.VoiceAction.ACCEPT){ //我方呼出,对方接受
                     //todo: 通话中界面更新;建立数据通话
-                } else if (tcpModel.getAction()==TcpAction.VoiceAction.REJECT){ //我方呼出,对方拒绝
+                    EventBus.getDefault().post(new MessageEvent(tcpModel,0));
+                } else if (tcpModel.getAction()== TcpAction.VoiceAction.REJECT){ //我方呼出,对方拒绝
                     //todo: 清掉呼出的TcpModel,通话中界面更新 --- 显示对方拒绝并停留3秒,结束至正常界面;更新左侧
-                } else if (tcpModel.getAction()==TcpAction.VoiceAction.CALLING){ //我方呼出,对方通话中
+                    EventBus.getDefault().post(new MessageEvent(tcpModel,0));
+                } else if (tcpModel.getAction()== TcpAction.VoiceAction.CALLING){ //我方呼出,对方通话中
                     //todo: 清掉呼出的TcpModel,通话中界面更新 --- 显示对方占线并停留3秒,结束至正常界面;更新左侧
-                } else if (tcpModel.getAction()==TcpAction.VoiceAction.FAILED){ //我方呼出,对方不在线,设备离线或其它错误
+                    EventBus.getDefault().post(new MessageEvent(tcpModel,0));
+                } else if (tcpModel.getAction()== TcpAction.VoiceAction.FAILED){ //我方呼出,对方不在线,设备离线或其它错误
                     //todo: 清掉呼出的TcpModel,通话中界面更新 --- 显示对方离线并停留3秒,结束至正常界面;更新左侧
-                } else if (tcpModel.getAction()==TcpAction.VoiceAction.HANDOFF){ //对方挂断,不论我方呼出或呼入
+                    EventBus.getDefault().post(new MessageEvent(tcpModel,0));
+                } else if (tcpModel.getAction()== TcpAction.VoiceAction.HANDOFF){ //对方挂断,不论我方呼出或呼入
                     //todo: 清掉呼出的TcpModel,通话中界面更新 --- 显示对方已挂断并停留3秒,结束至正常界面;更新左侧
+                    EventBus.getDefault().post(new MessageEvent(tcpModel,0));
+                }else if(tcpModel.getAction()== TcpAction.VoiceAction.SUCCESS){
+                    //todo 这个是自己点击了分机的呼叫 服务器返回给我数据 以供我 挂断时传输呼叫记录的id 因为分机
+                    //在点击呼叫之前 是没有呼叫记录的
+                    EventBus.getDefault().post(new MessageEvent(tcpModel,0));
                 }
                 break;
             case VIDEO:
                 break;
             case IM:
-                if (tcpModel.getAction()==TcpAction.IMAction.MSG){
+                if (tcpModel.getAction()== TcpAction.IMAction.MSG){
                     //todo: 从接口重新获取左侧数据;使用通话中界面,显示有语音留言,停留3秒,结束至正常界面
-                } else if (tcpModel.getAction()==TcpAction.IMAction.READ){ //语音已读取
+                    EventBus.getDefault().post(new MessageEvent(tcpModel,0));
+                } else if (tcpModel.getAction()== TcpAction.IMAction.MSG_READ){ //语音已读取
                     //todo: 从data得到语音id;更新左侧,注意这里不使用通话中界面提示已读
+                    EventBus.getDefault().post(new MessageEvent(tcpModel,0));
                 }
                 break;
             case EVENT:
-                if (tcpModel.getAction()==TcpAction.EventAction.KEY_CLICK){ //有新事件过来
+                if (tcpModel.getAction()== TcpAction.EventAction.KEY_CLICK){ //有新事件过来
                     //todo: 服务端通过data给出具体的事件名称放置data。从接口重新获取左侧数据;使用通话中界面,显示事件名称,停留3秒,结束至正常界面
-                } else if (tcpModel.getAction()==TcpAction.EventAction.RESPONSE){ //事件已处理,仅分机用
+                    Log.e(TAG,"收到事件tcp");
+                    EventBus.getDefault().post(new MessageEvent(tcpModel,0));
+
+                } else if (tcpModel.getAction()== TcpAction.EventAction.RESPONSE){ //事件已处理,仅分机用
                     //todo: 从data得到事件id,使用通话中界面,显示事件名称及已响应字样,停留3秒,结束至正常界面;更新左侧
+                    Log.e(TAG,"");
+                    EventBus.getDefault().post(new MessageEvent(tcpModel,0));
+                    Log.e(TAG,"收到事件已处理tcp");
                 }
                 break;
             case DATA:
-                if (tcpModel.getAction()==TcpAction.DataAction.REFRESH){
+                if (tcpModel.getAction()== TcpAction.DataAction.REFRESH){
                     //todo: 通过data判断刷新何种数据
+                    EventBus.getDefault().post(new MessageEvent(tcpModel,0));
+                }else if(tcpModel.getAction()== TcpAction.DataAction.INTERACTION){
+                    //todo: 刷新呼叫记录列表
+                    EventBus.getDefault().post(new MessageEvent(tcpModel,0));
                 }
                 break;
             case DEVICE:
                 if (tcpModel.getAction()== TcpAction.DeviceAction.RESTART){
                     //todo:重启设备
+                    EventBus.getDefault().post(new MessageEvent(tcpModel,0));
                 }
                 break;
         }

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

@@ -0,0 +1,15 @@
+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;
+
+public class DeviceUtil {
+    public static TcpModel deviceConnect(String mac){
+        TcpModel tcpModel = new TcpModel();
+        tcpModel.setType(TcpType.DEVICE);
+        tcpModel.setAction(TcpAction.DeviceAction.CONNECT);
+        tcpModel.setData(mac);
+        return tcpModel;
+    }
+}

+ 4 - 4
middleware/src/main/code/com/wdkl/ncs/android/middleware/tcp/channel/EventUtil.java

@@ -5,23 +5,23 @@ import com.wdkl.ncs.android.middleware.tcp.enums.TcpAction;
 import com.wdkl.ncs.android.middleware.tcp.enums.TcpType;
 
 public class EventUtil {
-    public static TcpModel eventKeyClick(Integer fromId, Integer toId, Integer eventId){
+    public static TcpModel eventKeyClick(Integer fromId, Integer toId, Integer ineractionId){
         TcpModel tcpModel = new TcpModel();
         tcpModel.setType(TcpType.EVENT);
         tcpModel.setAction(TcpAction.EventAction.KEY_CLICK);
         tcpModel.setFromId(fromId);
         tcpModel.setToId(toId);
-        tcpModel.setData(eventId);
+        tcpModel.setData(ineractionId);
         return tcpModel;
     }
 
-    public static TcpModel eventResponse(Integer fromId, Integer toId, Integer eventId){
+    public static TcpModel eventResponse(Integer fromId, Integer toId, Integer ineractionId){
         TcpModel tcpModel = new TcpModel();
         tcpModel.setType(TcpType.EVENT);
         tcpModel.setAction(TcpAction.EventAction.RESPONSE);
         tcpModel.setFromId(fromId);
         tcpModel.setToId(toId);
-        tcpModel.setData(eventId);
+        tcpModel.setData(ineractionId);
         return tcpModel;
     }
 }

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

@@ -18,7 +18,7 @@ public class ImUtil {
     public static TcpModel imRead(Integer fromId, Integer toId, Integer msgId){
         TcpModel tcpModel = new TcpModel();
         tcpModel.setType(TcpType.IM);
-        tcpModel.setAction(TcpAction.IMAction.READ);
+        tcpModel.setAction(TcpAction.IMAction.MSG_READ);
         tcpModel.setFromId(fromId);
         tcpModel.setToId(toId);
         tcpModel.setData(msgId);

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

@@ -14,57 +14,72 @@ public class VoiceUtil {
         return tcpModel;
     }
 
-    public static TcpModel voiceAccept(Integer fromId, Integer toId){
+    public static TcpModel voiceAccept(Integer fromId, Integer toId,Integer InteractionId){
         TcpModel tcpModel = new TcpModel();
         tcpModel.setType(TcpType.VOICE);
         tcpModel.setAction(TcpAction.VoiceAction.ACCEPT);
         tcpModel.setFromId(fromId);
         tcpModel.setToId(toId);
+        tcpModel.setData(InteractionId);
         return tcpModel;
     }
 
-    public static TcpModel voiceReject(Integer fromId, Integer toId){
+    public static TcpModel voiceReject(Integer fromId, Integer toId,Integer InteractionId){
         TcpModel tcpModel = new TcpModel();
         tcpModel.setType(TcpType.VOICE);
         tcpModel.setAction(TcpAction.VoiceAction.REJECT);
         tcpModel.setFromId(fromId);
         tcpModel.setToId(toId);
+        tcpModel.setData(InteractionId);
         return tcpModel;
     }
 
-    public static TcpModel voiceCalling(Integer fromId, Integer toId){
+    public static TcpModel voiceCalling(Integer fromId, Integer toId,Integer InteractionId){
         TcpModel tcpModel = new TcpModel();
         tcpModel.setType(TcpType.VOICE);
         tcpModel.setAction(TcpAction.VoiceAction.CALLING);
         tcpModel.setFromId(fromId);
         tcpModel.setToId(toId);
+        tcpModel.setData(InteractionId);
         return tcpModel;
     }
 
-    public static TcpModel voiceCancel(Integer fromId, Integer toId){
+    public static TcpModel voiceCancel(Integer fromId, Integer toId,Integer InteractionId){
+        TcpModel tcpModel = new TcpModel();
+//        tcpModel.setType(TcpType.VOICE);
+//        tcpModel.setAction(TcpAction.VoiceAction.CANCEL);
+//        tcpModel.setFromId(fromId);
+//        tcpModel.setToId(toId);
+        return tcpModel;
+    }
+
+    public static TcpModel voiceHandoff(Integer fromId, Integer toId,Integer InteractionId){
         TcpModel tcpModel = new TcpModel();
         tcpModel.setType(TcpType.VOICE);
-        tcpModel.setAction(TcpAction.VoiceAction.CANCEL);
+        tcpModel.setAction(TcpAction.VoiceAction.HANDOFF);
         tcpModel.setFromId(fromId);
         tcpModel.setToId(toId);
+        tcpModel.setData(InteractionId);
         return tcpModel;
     }
 
-    public static TcpModel voiceHandoff(Integer fromId, Integer toId){
+    public static TcpModel voiceSuccess(Integer fromId, Integer toId,Integer InteractionId){
         TcpModel tcpModel = new TcpModel();
         tcpModel.setType(TcpType.VOICE);
-        tcpModel.setAction(TcpAction.VoiceAction.HANDOFF);
+        tcpModel.setAction(TcpAction.VoiceAction.SUCCESS);
         tcpModel.setFromId(fromId);
         tcpModel.setToId(toId);
+        tcpModel.setData(InteractionId);
         return tcpModel;
     }
 
-    public static TcpModel voiceSuccess(Integer fromId, Integer toId){
+    public static TcpModel voiceFailed(Integer fromId, Integer toId,Integer InteractionId){
         TcpModel tcpModel = new TcpModel();
         tcpModel.setType(TcpType.VOICE);
-        tcpModel.setAction(TcpAction.VoiceAction.SUCCESS);
+        tcpModel.setAction(TcpAction.VoiceAction.FAILED);
         tcpModel.setFromId(fromId);
         tcpModel.setToId(toId);
+        tcpModel.setData(InteractionId);
         return tcpModel;
     }
 }

+ 24 - 6
middleware/src/main/code/com/wdkl/ncs/android/middleware/tcp/dto/TcpModel.java

@@ -3,10 +3,10 @@ package com.wdkl.ncs.android.middleware.tcp.dto;
 import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSONObject;
 import com.google.common.base.Strings;
-import com.wdkl.ncs.android.middleware.tcp.enums.TcpAction;
-import com.wdkl.ncs.android.middleware.tcp.enums.TcpType;
 import com.wdkl.ncs.android.middleware.model.dos.DeviceDO;
 import com.wdkl.ncs.android.middleware.model.dos.FrameDO;
+import com.wdkl.ncs.android.middleware.tcp.enums.TcpAction;
+import com.wdkl.ncs.android.middleware.tcp.enums.TcpType;
 
 import java.io.Serializable;
 import java.util.HashMap;
@@ -74,7 +74,7 @@ public class TcpModel implements Serializable {
         this.toId = toId;
     }
 
-    public Object getData() {
+    public Object  getData() {
         return data;
     }
 
@@ -95,8 +95,8 @@ public class TcpModel implements Serializable {
         JSONObject jsonObject = JSON.parseObject(tcpModelJsonString);
         String type = jsonObject.getString("type");
         String action = jsonObject.getString("action");
-        Integer fromId = jsonObject.getInteger("from_id");
-        Integer toId = jsonObject.getInteger("to_id");
+        Integer fromId = jsonObject.getInteger("fromId");
+        Integer toId = jsonObject.getInteger("toId");
         String dataString = jsonObject.getString("data");
 
         TcpType tcpType = TcpType.fromString(type);
@@ -109,7 +109,10 @@ public class TcpModel implements Serializable {
                 tcpAction = TcpAction.VoiceAction.fromString(action);
                 break;
             case VIDEO:
-                tcpAction = TcpAction.VedioAction.fromString(action);
+                tcpAction = TcpAction.VideoAction.fromString(action);
+                break;
+            case IM:
+                tcpAction = TcpAction.IMAction.fromString(action);
                 break;
             case BROADCAST:
                 tcpAction = TcpAction.BroadcastAction.fromString(action);
@@ -151,6 +154,21 @@ public class TcpModel implements Serializable {
         return tcpModel.toJson();
     }
 
+    public static String refresh() {
+        TcpModel tcpModel = new TcpModel();
+        tcpModel.setType(TcpType.DATA);
+        tcpModel.setAction(TcpAction.DataAction.REFRESH);
+        return tcpModel.toJson();
+    }
+
+
+    public static String interaction() {
+        TcpModel tcpModel = new TcpModel();
+        tcpModel.setType(TcpType.DATA);
+        tcpModel.setAction(TcpAction.DataAction.INTERACTION);
+        return tcpModel.toJson();
+    }
+
     /**
      * 示例
      * @param args

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

@@ -45,13 +45,10 @@ public interface TcpAction {
         ACCEPT("接受呼叫"),
         REJECT("拒绝"),
         CALLING("通话中"),
-        CANCEL("取消"),
         TRANSFER("转接"),
         HANDOFF("挂断"),
         SUCCESS("呼叫成功"),
-        FAILED("呼叫失败"),
-        MSG_READ("语音留言已读"),
-        MSG("语音留言");
+        FAILED("呼叫失败");
 
         private String description;
         VoiceAction(String description){
@@ -78,12 +75,12 @@ public interface TcpAction {
         }
     }
 
-    enum VedioAction implements TcpAction {
+    enum VideoAction implements TcpAction {
         CALL("呼叫"),
         CANCEL("取消");
 
         private String description;
-        VedioAction(String description){
+        VideoAction(String description){
             this.description = description;
         }
 
@@ -95,22 +92,22 @@ public interface TcpAction {
             return this.name();
         }
 
-        private final static Map<String , VedioAction> ENUM_MAP = new HashMap<String, VedioAction>();
+        private final static Map<String , VideoAction> ENUM_MAP = new HashMap<String, VideoAction>();
         static {
-            for(VedioAction v : values()) {
+            for(VideoAction v : values()) {
                 ENUM_MAP.put(v.toString() , v);
             }
         }
-        public static VedioAction fromString(String v) {
-            VedioAction userOptionEnum = ENUM_MAP.get(v);
+        public static VideoAction fromString(String v) {
+            VideoAction userOptionEnum = ENUM_MAP.get(v);
             return userOptionEnum == null ? CALL :userOptionEnum;
         }
     }
 
+
     enum IMAction implements TcpAction {
-        MSG("留言"),
-        RECEIVE("接收"),
-        READ("已读");
+        MSG("语音留言"),
+        MSG_READ("语音留言已读");
 
         private String description;
         IMAction(String description){
@@ -133,13 +130,14 @@ public interface TcpAction {
         }
         public static IMAction fromString(String v) {
             IMAction userOptionEnum = ENUM_MAP.get(v);
-            return userOptionEnum == null ? RECEIVE :userOptionEnum;
+            return userOptionEnum == null ? MSG_READ :userOptionEnum;
         }
 
     }
 
     enum DeviceAction implements TcpAction {
-        RESTART("重启");
+        RESTART("重启"),
+        CONNECT("连接");
         private String description;
         DeviceAction(String description){
             this.description = description;
@@ -192,7 +190,8 @@ public interface TcpAction {
     }
 
     enum DataAction implements TcpAction {
-        REFRESH("刷新数据");
+        REFRESH("刷新数据"),
+        INTERACTION("刷新交互列表");
         private String description;
         DataAction(String description){
             this.description = description;

+ 26 - 0
middleware/src/main/code/com/wdkl/ncs/android/middleware/utils/MessageEvent.kt

@@ -0,0 +1,26 @@
+package com.wdkl.ncs.android.middleware.utils
+
+class MessageEvent(var tcpModel: Any,var type: Int) {
+
+    private var message: Any? = null
+    private var types: Int? =0
+
+    fun getMessage(): Any? {
+        return tcpModel
+    }
+
+    fun setMessage(tcpModel: Any?) {
+        this.message = tcpModel
+    }
+
+    fun getType(): Int? {
+        return types
+    }
+
+    fun setType(type: Int?) {
+        this.types = type
+    }
+
+
+
+}

+ 1 - 1
resource/src/main/res/values/strings.xml

@@ -1,5 +1,5 @@
 <resources>
-    <string name="javashop_app_name">JavaShop</string>
+    <string name="javashop_app_name">Watch</string>
     <string name="javashop_qrcode_name">扫啊扫</string>
     <string name="javashop_navigation_home_title">首页</string>
     <string name="javashop_navigation_category_title">分类</string>

+ 1 - 1
settings.gradle

@@ -1 +1 @@
-include ':app', ':common', ':welcome', ':home', ':resource', ':middleware', ':shop', ':setting', ':extra', ':hello'
+include ':app', ':common', ':welcome', ':home', ':resource', ':middleware', ':shop', ':setting', ':extra', ':hello', ':starRTC'

+ 1 - 0
starRTC/.gitignore

@@ -0,0 +1 @@
+/build

+ 61 - 0
starRTC/build.gradle

@@ -0,0 +1,61 @@
+//apply plugin: 'com.android.application'
+apply plugin: 'com.android.library'
+android {
+    compileSdkVersion 30
+    buildToolsVersion "30.0.2"
+
+
+    defaultConfig {
+//        applicationId "com.starrtc.demo"
+        minSdkVersion 15
+        targetSdkVersion 30
+        versionCode 1
+        versionName "1.0"
+
+        testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
+        ndk {
+            moduleName "app"
+            abiFilters 'armeabi-v7a','arm64-v8a'
+        }
+    }
+
+    buildTypes {
+        release {
+            minifyEnabled false
+            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
+        }
+    }
+    sourceSets {
+        main {
+            jniLibs.srcDirs = ['libs']
+        }
+    }
+    lintOptions {
+        checkReleaseBuilds false
+        // Or, if you prefer, you can continue to check for errors in release builds,
+        // but continue the build even when errors are found:
+        abortOnError false
+    }
+
+}
+
+dependencies {
+//    implementation fileTree(dir: 'libs', include: ['*.jar'])
+//
+//    implementation 'androidx.appcompat:appcompat:1.0.2'
+//    implementation 'androidx.constraintlayout:constraintlayout:1.1.3'
+//    testImplementation 'junit:junit:4.12'
+//    androidTestImplementation 'androidx.test.ext:junit:1.1.0'
+//    androidTestImplementation 'androidx.test.espresso:espresso-core:3.1.1'
+
+    compile fileTree(dir: 'libs', include: ['*.jar'])
+    androidTestCompile('com.android.support.test.espresso:espresso-core:+', {
+        exclude group: 'com.android.support', module: 'support-annotations'
+    })
+    compile 'com.android.support:appcompat-v7:26.+'
+    compile 'com.android.support.constraint:constraint-layout:1.0.2'
+    testCompile 'junit:junit:4.12'
+    compile 'com.android.support:recyclerview-v7:24.2.0'
+    compile files('libs/star_rtc_sdk.jar')
+    implementation files('libs\\star_rtc_sdk.jar')
+}

BIN
starRTC/libs/arm64-v8a/libstarCore.so


BIN
starRTC/libs/arm64-v8a/libstarRTC.so


BIN
starRTC/libs/armeabi-v7a/libstarCore.so


BIN
starRTC/libs/armeabi-v7a/libstarRTC.so


BIN
starRTC/libs/star_rtc_sdk.jar


+ 21 - 0
starRTC/proguard-rules.pro

@@ -0,0 +1,21 @@
+# Add project specific ProGuard rules here.
+# You can control the set of applied configuration files using the
+# proguardFiles setting in build.gradle.
+#
+# For more details, see
+#   http://developer.android.com/guide/developing/tools/proguard.html
+
+# If your project uses WebView with JS, uncomment the following
+# and specify the fully qualified class name to the JavaScript interface
+# class:
+#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
+#   public *;
+#}
+
+# Uncomment this to preserve the line number information for
+# debugging stack traces.
+#-keepattributes SourceFile,LineNumberTable
+
+# If you keep the line number information, uncomment this to
+# hide the original source file name.
+#-renamesourcefileattribute SourceFile

+ 27 - 0
starRTC/src/androidTest/java/com/starrtc/demo/ExampleInstrumentedTest.java

@@ -0,0 +1,27 @@
+package com.starrtc.demo;
+
+import android.content.Context;
+
+import androidx.test.platform.app.InstrumentationRegistry;
+import androidx.test.ext.junit.runners.AndroidJUnit4;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+import static org.junit.Assert.*;
+
+/**
+ * Instrumented test, which will execute on an Android device.
+ *
+ * @see <a href="http://d.android.com/tools/testing">Testing documentation</a>
+ */
+@RunWith(AndroidJUnit4.class)
+public class ExampleInstrumentedTest {
+    @Test
+    public void useAppContext() {
+        // Context of the app under test.
+        Context appContext = InstrumentationRegistry.getInstrumentation().getTargetContext();
+
+        assertEquals("com.starrtc.demo", appContext.getPackageName());
+    }
+}

+ 205 - 0
starRTC/src/main/AndroidManifest.xml

@@ -0,0 +1,205 @@
+<?xml version="1.0" encoding="utf-8"?>
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:tools="http://schemas.android.com/tools"
+    package="com.starrtc.demo">
+
+
+    <uses-feature android:name="android.hardware.camera" />
+    <uses-feature android:name="android.hardware.camera.autofocus" />
+
+    <uses-permission android:name="android.permission.CAMERA" />
+    <uses-permission android:name="android.permission.FLASHLIGHT" />
+    <uses-permission android:name="android.permission.INTERNET" />
+    <uses-permission android:name="android.permission.READ_PHONE_STATE" />
+    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
+    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
+    <uses-permission android:name="android.permission.BLUETOOTH" />
+    <uses-permission android:name="android.permission.RECORD_AUDIO" />
+    <uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />
+    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
+    <uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" />
+
+    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
+    <uses-permission android:name="android.permission.READ_LOGS" />
+
+    <application
+        android:allowBackup="true"
+        android:supportsRtl="true">
+
+<!--    <application-->
+<!--        android:name="App"-->
+<!--        android:allowBackup="true"-->
+<!--        android:icon="@drawable/star_fox_500"-->
+<!--        android:label="@string/app_name"-->
+<!--        android:supportsRtl="true"-->
+<!--        android:theme="@style/AppTheme"-->
+<!--        tools:ignore="GoogleAppIndexingWarning"-->
+<!--        android:usesCleartextTraffic="true"-->
+<!--        tools:targetApi="m">-->
+<!--        <activity-->
+<!--            android:name=".demo.SplashActivity"-->
+<!--            android:screenOrientation="portrait">-->
+<!--            &lt;!&ndash;android:screenOrientation="landscape"&ndash;&gt;-->
+<!--            <intent-filter>-->
+<!--                <action android:name="android.intent.action.MAIN" />-->
+<!--                <category android:name="android.intent.category.LAUNCHER" />-->
+<!--            </intent-filter>-->
+<!--        </activity>-->
+
+        <service android:name=".demo.service.KeepLiveService">
+            <intent-filter>
+                <action android:name="com.starrtc.demo.service.KeepLiveService"/>
+            </intent-filter>
+        </service>
+
+        <service
+            android:name=".demo.service.FloatWindowsService"
+            android:exported="false"></service>
+
+        <activity
+            android:name=".demo.StarAvDemoActivity"
+            android:screenOrientation="portrait" />
+
+        <!-- 设置 -->
+        <activity
+            android:name=".demo.setting.AboutActivity"
+            android:screenOrientation="portrait" />
+        <activity
+            android:name=".demo.setting.SettingActivity"
+            android:screenOrientation="portrait" />
+
+        <!-- VOIP -->
+        <activity
+            android:name=".demo.voip.VoipListActivity"
+            android:screenOrientation="portrait" />
+        <activity
+            android:name=".demo.voip.VoipActivity"
+            android:screenOrientation="portrait" />
+        <activity
+            android:name=".demo.voip.VoipAudioActivity"
+            android:screenOrientation="portrait" />
+        <activity
+            android:name=".demo.voip.VoipCreateActivity"
+            android:screenOrientation="portrait" />
+        <activity
+            android:name=".demo.voip.VoipRingingActivity"
+            android:screenOrientation="portrait" />
+        <activity
+            android:name=".demo.voip.VoipAudioRingingActivity"
+            android:screenOrientation="portrait" />
+        <!-- P2P直连 -->
+        <activity android:name=".demo.p2p.VoipP2PDemoActivity"
+            android:screenOrientation="landscape"/>
+        <activity android:name=".demo.p2p.VoipP2PCreateActivity"
+            android:screenOrientation="landscape"/>
+        <activity android:name=".demo.p2p.VoipP2PRingingActivity"
+            android:screenOrientation="landscape"/>
+        <activity android:name=".demo.p2p.VoipP2PActivity"
+            android:screenOrientation="landscape"/>
+        <!-- 视频互动直播 -->
+        <activity
+            android:name=".demo.videolive.VideoLiveListActivity"
+            android:screenOrientation="portrait" />
+        <activity
+            android:name=".demo.videolive.VideoLiveCreateActivity"
+            android:screenOrientation="portrait" />
+        <activity
+            android:name=".demo.videolive.VideoLiveActivity"
+            android:screenOrientation="portrait" />
+
+        <!-- 视频会议 -->
+        <activity
+            android:name=".demo.videomeeting.VideoMeetingActivity"
+            android:screenOrientation="landscape" />
+        <activity
+            android:name=".demo.videomeeting.VideoMeetingListActivity"
+            android:screenOrientation="portrait" />
+        <activity
+            android:name=".demo.videomeeting.VideoMeetingCreateActivity"
+            android:screenOrientation="portrait" />
+
+        <!-- 超级聊天室 -->
+        <activity
+            android:name=".demo.superroom.SuperRoomActivity"
+            android:screenOrientation="portrait" />
+        <activity
+            android:name=".demo.superroom.SuperRoomCreateActivity"
+            android:screenOrientation="portrait" />
+        <activity
+            android:name=".demo.superroom.SuperRoomListActivity"
+            android:screenOrientation="portrait" />
+
+        <!-- 测试 -->
+        <activity
+            android:name=".demo.test.LoopTestActivity"
+            android:screenOrientation="portrait" />
+
+        <!-- IM -->
+        <activity
+            android:name=".demo.im.chatroom.ChatroomActivity"
+            android:screenOrientation="portrait" />
+        <activity
+            android:name=".demo.im.chatroom.ChatroomCreateActivity"
+            android:screenOrientation="portrait" />
+        <activity
+            android:name=".demo.im.chatroom.ChatroomListActivity"
+            android:screenOrientation="portrait" />
+        <activity
+            android:name=".demo.im.IMDemoActivity"
+            android:screenOrientation="portrait" />
+        <activity
+            android:name=".demo.im.c2c.C2CActivity"
+            android:screenOrientation="portrait" />
+        <activity
+            android:name=".demo.im.group.MessageGroupActivity"
+            android:screenOrientation="portrait" />
+        <activity
+            android:name=".demo.im.group.MessageGroupCreateActivity"
+            android:screenOrientation="portrait" />
+        <activity
+            android:name=".demo.im.group.MessageGroupListActivity"
+            android:screenOrientation="portrait" />
+        <activity
+            android:name=".demo.im.c2c.C2CListActivity"
+            android:screenOrientation="portrait" />
+        <activity
+            android:name=".demo.im.c2c.C2CCreateActivity"
+            android:screenOrientation="portrait" />
+        <activity
+            android:name=".demo.im.group.MessageGroupSettingActivity"
+            android:screenOrientation="portrait" />
+
+        <!-- 音频互动直播 -->
+        <activity
+            android:name=".demo.audiolive.AudioLiveListActivity"
+            android:screenOrientation="portrait" />
+        <activity
+            android:name=".demo.audiolive.AudioLiveCreateActivity"
+            android:screenOrientation="portrait" />
+        <activity
+            android:name=".demo.audiolive.AudioLiveActivity"
+            android:screenOrientation="portrait" />
+
+        <!-- 小班课 -->
+        <activity
+            android:name=".demo.miniclass.MiniClassCreateActivity"
+            android:screenOrientation="portrait" />
+        <activity
+            android:name=".demo.miniclass.MiniClassListActivity"
+            android:screenOrientation="portrait" />
+        <activity
+            android:name=".demo.miniclass.MiniClassActivity"
+            android:screenOrientation="landscape" />
+        <activity android:name=".demo.setting.SetupServerHostActivity"></activity>
+
+        <!--rtsp转发测试-->
+        <activity
+            android:name=".demo.thirdstream.RtspTestActivity"
+            android:screenOrientation="portrait" />
+        <activity
+            android:name=".demo.thirdstream.RtspTestListActivity"
+            android:screenOrientation="portrait" />
+
+    </application>
+
+</manifest>

+ 10 - 0
starRTC/src/main/java/com/starrtc/demo/App.java

@@ -0,0 +1,10 @@
+package com.starrtc.demo;
+
+import android.app.Application;
+
+public class App extends Application {
+    @Override
+    public void onCreate(){
+        super.onCreate();
+    }
+}

+ 166 - 0
starRTC/src/main/java/com/starrtc/demo/database/CoreDB.java

@@ -0,0 +1,166 @@
+package com.starrtc.demo.database;
+
+import android.database.Cursor;
+
+import com.starrtc.demo.demo.MLOC;
+import com.starrtc.demo.utils.AEvent;
+import com.starrtc.demo.utils.CoreDBManager;
+import com.starrtc.demo.utils.IEventListener;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public class CoreDB implements IEventListener {
+    //原有demo的
+//    public static String APP_DB_PATH = "/data/data/com.starrtc.demo/";
+
+    public static String APP_DB_PATH = "/data/data/com.wdkl.app.ncs.watch/";
+    private final String TEXTTAG = "CoreDB";
+    private static final String HISTORY_TABLE = "historyListTable";
+    private static final String MSG_TABLE = "allMsgTable";
+
+    public static final String HISTORY_TYPE_VOIP = "voip";
+    public static final String HISTORY_TYPE_C2C = "c2c";
+    public static final String HISTORY_TYPE_GROUP = "group";
+
+
+
+    public static CoreDBManager coreDBM = new CoreDBManager();
+
+    public CoreDB(){
+        AEvent.removeListener(AEvent.AEVENT_RESET,this);
+        AEvent.addListener(AEvent.AEVENT_RESET,this);
+        MLOC.d(TEXTTAG,"reset DB:"+ MLOC.userId);
+        coreDBM.initCoreDB(APP_DB_PATH +"databases/", MLOC.userId);
+        //历史表
+        coreDBM.execSQL("create table if not exists "+HISTORY_TABLE+"(" +
+                "id INTEGER PRIMARY KEY," +
+                "type TEXT ," +
+                "conversationId TEXT ," +
+                "newMsg INTEGER," +
+                "groupName TEXT," +
+                "groupCreaterId TEXT," +
+                "lastMsg TEXT," +
+                "lastTime TEXT)");
+        //消息表
+        coreDBM.execSQL("create table if not exists "+MSG_TABLE+"(" +
+                "id INTEGER PRIMARY KEY," +
+                "conversationId TEXT," +
+                "fromId TEXT," +
+                "atId TEXT," +
+                "msg TEXT," +
+                "time TEXT)");
+
+    }
+
+    @Override
+    public void dispatchEvent(String aEventID, boolean success, Object eventObj) {
+
+        switch (aEventID) {
+            case AEvent.AEVENT_RESET : {
+                if(coreDBM != null){
+                    coreDBM.close();
+                }
+                break;
+            }
+        }
+    }
+
+    public List<HistoryBean> getHistory(String type){
+        Cursor cursor = coreDBM.rawQuery("select * from "+HISTORY_TABLE+" where type=? order by id desc",new String[]{type});
+        List<HistoryBean> list = new ArrayList<HistoryBean>();
+        while (cursor != null && cursor.moveToNext()) {
+            HistoryBean bean = new HistoryBean();
+            bean.setId(cursor.getInt(cursor.getColumnIndex("id")));
+            bean.setConversationId(cursor.getString(cursor.getColumnIndex("conversationId")));
+            bean.setNewMsgCount(cursor.getInt(cursor.getColumnIndex("newMsg")));
+            bean.setLastMsg(cursor.getString(cursor.getColumnIndex("lastMsg")));
+            bean.setLastTime(cursor.getString(cursor.getColumnIndex("lastTime")));
+            bean.setGroupName(cursor.getString(cursor.getColumnIndex("groupName")));
+            bean.setGroupCreaterId(cursor.getString(cursor.getColumnIndex("groupCreaterId")));
+            bean.setType(type);
+            list.add(bean);
+        }
+        if (cursor != null) cursor.close();
+        return list;
+    }
+
+    public void updateHistory(HistoryBean historyBean){
+        if(historyBean.getConversationId()==null||historyBean.getType()==null)return;
+        Cursor cursor = coreDBM.rawQuery("select * from " + HISTORY_TABLE + " where type=? and conversationId=?",
+                new String[]{historyBean.getType(), historyBean.getConversationId()});
+        if(cursor!=null&&cursor.moveToNext()){
+            if (cursor != null) cursor.close();
+            coreDBM.execSQL("UPDATE "+HISTORY_TABLE+" SET newMsg = ?," +
+                            " lastMsg = ?," +
+                            " lastTime = ?" +
+                            " where type=? and conversationId=?",
+                    new Object[]{
+                            historyBean.getNewMsgCount(), historyBean.getLastMsg(),
+                            historyBean.getLastTime(),
+                            historyBean.getType(), historyBean.getConversationId()});
+        }
+    }
+
+    public void addHistory(HistoryBean historyBean, Boolean hasRead){
+        if(historyBean.getConversationId()==null||historyBean.getType()==null)return;
+        Cursor cursor = coreDBM.rawQuery("select * from " + HISTORY_TABLE + " where type=? and conversationId=?",
+                new String[]{historyBean.getType(), historyBean.getConversationId()});
+        if(cursor!=null&&cursor.moveToNext()){
+            historyBean.setId(cursor.getInt(cursor.getColumnIndex("id")));
+            if(!hasRead){
+                historyBean.setNewMsgCount(cursor.getInt(cursor.getColumnIndex("newMsg"))+1);
+            }else{
+                historyBean.setNewMsgCount(0);
+            }
+            if (cursor != null) cursor.close();
+            coreDBM.execSQL("UPDATE "+HISTORY_TABLE+" SET newMsg = ?," +
+                    " lastMsg = ?," +
+                    " lastTime = ?" +
+                    " where type=? and conversationId=?",
+                    new Object[]{
+                            historyBean.getNewMsgCount(), historyBean.getLastMsg(),
+                            historyBean.getLastTime(),
+                            historyBean.getType(), historyBean.getConversationId()});
+        }else{
+            if(hasRead){
+                historyBean.setNewMsgCount(0);
+            }
+            coreDBM.execSQL("insert into " + HISTORY_TABLE + "(type,conversationId,newMsg,lastMsg,lastTime,groupName,groupCreaterId) values(?,?,?,?,?,?,?)",
+                    new Object[]{historyBean.getType(), historyBean.getConversationId(),
+                            historyBean.getNewMsgCount(), historyBean.getLastMsg(),
+                            historyBean.getLastTime(),historyBean.getGroupName(),
+                            historyBean.getGroupCreaterId()});
+        }
+
+    }
+
+    public void removeHistory(HistoryBean historyBean){
+        if(historyBean.getConversationId()==null||historyBean.getType()==null)return;
+        coreDBM.rawQuery("delete from " + HISTORY_TABLE + " where type=? and conversationId=?",
+                new String[]{historyBean.getType(), historyBean.getConversationId()});
+        coreDBM.rawQuery("delete from " + MSG_TABLE + " where conversationId=?", new String[]{historyBean.getConversationId()});
+    }
+
+    public List<MessageBean> getMessageList(String conversationId){
+        List<MessageBean> list = new ArrayList<>();
+        Cursor cursor = coreDBM.rawQuery("select * from " + MSG_TABLE + " where conversationId=? order by id desc limit 5", new String[]{conversationId});
+        while (cursor!=null&&cursor.moveToNext()){
+            MessageBean bean = new MessageBean();
+            bean.setId(cursor.getInt(cursor.getColumnIndex("id")));
+            bean.setConversationId(cursor.getString(cursor.getColumnIndex("conversationId")));
+            bean.setFromId(cursor.getString(cursor.getColumnIndex("fromId")));
+            bean.setMsg(cursor.getString(cursor.getColumnIndex("msg")));
+            bean.setTime(cursor.getString(cursor.getColumnIndex("time")));
+            list.add(0,bean);
+        }
+        if (cursor != null) cursor.close();
+        return list;
+    }
+    public void setMessage(MessageBean messageBean){
+        coreDBM.execSQL("insert into "+MSG_TABLE+" (conversationId,fromId,msg,time) values(?,?,?,?)",
+                new Object[]{messageBean.getConversationId(),messageBean.getFromId(),
+                        messageBean.getMsg(),messageBean.getTime()});
+    }
+
+}

+ 0 - 0
starRTC/src/main/java/com/starrtc/demo/database/HistoryBean.java


Daži faili netika attēloti, jo izmaiņu fails ir pārāk liels