allen 4 rokov pred
rodič
commit
a68db5ffdc
32 zmenil súbory, kde vykonal 2044 pridanie a 413 odobranie
  1. BIN
      .gradle/4.4/javaCompile/jarAnalysis.bin
  2. 4 2
      .idea/gradle.xml
  3. 1 1
      .idea/misc.xml
  4. 2 1
      app/src/main/AndroidManifest.xml
  5. 253 128
      build.gradle
  6. 3 1
      home/src/main/AndroidManifest.xml
  7. 4 3
      home/src/main/code/com/wdkl/ncs/android/component/home/activity/AppUpdateActivity.kt
  8. 7 0
      home/src/main/code/com/wdkl/ncs/android/component/home/activity/EventActivity.kt
  9. 50 19
      home/src/main/code/com/wdkl/ncs/android/component/home/activity/WatchCallRecordsActivity.kt
  10. 100 56
      home/src/main/code/com/wdkl/ncs/android/component/home/activity/WatchEventDetailActivity.kt
  11. 656 0
      home/src/main/code/com/wdkl/ncs/android/component/home/activity/WatchHome2Activity.kt
  12. 16 1
      home/src/main/code/com/wdkl/ncs/android/component/home/activity/WatchHomeActivity.kt
  13. 165 70
      home/src/main/code/com/wdkl/ncs/android/component/home/activity/WebRTCVoipAudioActivity.kt
  14. 21 3
      home/src/main/code/com/wdkl/ncs/android/component/home/activity/WebRTCVoipAudioRingingActivity.kt
  15. 4 2
      home/src/main/code/com/wdkl/ncs/android/component/home/di/HomeComponent.kt
  16. 46 11
      home/src/main/code/com/wdkl/ncs/android/component/home/helper/AppUpdateHelper.java
  17. 193 4
      home/src/main/code/com/wdkl/ncs/android/component/home/service/APPService.kt
  18. 5 0
      home/src/main/code/com/wdkl/ncs/android/component/home/service/TcpHandleService.kt
  19. 1 1
      home/src/main/code/com/wdkl/ncs/android/component/home/util/Util.kt
  20. 2 0
      home/src/main/java/com/wdkl/ncs/android/component/home/SOSEmergencyCallActivity.kt
  21. 1 2
      home/src/main/res/drawable/shape_untreated_quantity.xml
  22. 23 1
      home/src/main/res/layout/activity_web_rtc_voip_audio.xml
  23. 2 2
      home/src/main/res/layout/activity_web_rtc_voip_audio_ringing.xml
  24. 105 95
      home/src/main/res/layout/watch_activity_event_detail.xml
  25. 2 3
      home/src/main/res/layout/watch_activity_home.xml
  26. 261 0
      home/src/main/res/layout/watch_activity_home2.xml
  27. 6 0
      middleware/src/main/code/com/wdkl/ncs/android/middleware/common/Constants.kt
  28. 12 0
      middleware/src/main/code/com/wdkl/ncs/android/middleware/logic/contract/home/WatchHomeActivityContract.kt
  29. 60 2
      middleware/src/main/code/com/wdkl/ncs/android/middleware/logic/presenter/home/WatchHomeActivityPresenter.kt
  30. 10 3
      middleware/src/main/code/com/wdkl/ncs/android/middleware/tcp/TcpClientHandler.java
  31. 27 2
      middleware/src/main/code/com/wdkl/ncs/android/middleware/tcp/channel/DeviceChannel.java
  32. 2 0
      middleware/src/main/code/com/wdkl/ncs/android/middleware/tcp/enums/TcpAction.java

BIN
.gradle/4.4/javaCompile/jarAnalysis.bin


+ 4 - 2
.idea/gradle.xml

@@ -1,14 +1,17 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <?xml version="1.0" encoding="UTF-8"?>
 <project version="4">
 <project version="4">
+  <component name="GradleMigrationSettings" migrationVersion="1" />
   <component name="GradleSettings">
   <component name="GradleSettings">
     <option name="linkedExternalProjectsSettings">
     <option name="linkedExternalProjectsSettings">
       <GradleProjectSettings>
       <GradleProjectSettings>
+        <option name="testRunner" value="PLATFORM" />
         <option name="distributionType" value="DEFAULT_WRAPPED" />
         <option name="distributionType" value="DEFAULT_WRAPPED" />
         <option name="externalProjectPath" value="$PROJECT_DIR$" />
         <option name="externalProjectPath" value="$PROJECT_DIR$" />
         <option name="modules">
         <option name="modules">
           <set>
           <set>
             <option value="$PROJECT_DIR$" />
             <option value="$PROJECT_DIR$" />
             <option value="$PROJECT_DIR$/AmDemo_R" />
             <option value="$PROJECT_DIR$/AmDemo_R" />
+            <option value="$PROJECT_DIR$/WebRTC" />
             <option value="$PROJECT_DIR$/app" />
             <option value="$PROJECT_DIR$/app" />
             <option value="$PROJECT_DIR$/common" />
             <option value="$PROJECT_DIR$/common" />
             <option value="$PROJECT_DIR$/extra" />
             <option value="$PROJECT_DIR$/extra" />
@@ -21,12 +24,11 @@
             <option value="$PROJECT_DIR$/setting" />
             <option value="$PROJECT_DIR$/setting" />
             <option value="$PROJECT_DIR$/shop" />
             <option value="$PROJECT_DIR$/shop" />
             <option value="$PROJECT_DIR$/starRTC" />
             <option value="$PROJECT_DIR$/starRTC" />
-            <option value="$PROJECT_DIR$/webrtc" />
             <option value="$PROJECT_DIR$/welcome" />
             <option value="$PROJECT_DIR$/welcome" />
           </set>
           </set>
         </option>
         </option>
         <option name="resolveModulePerSourceSet" value="false" />
         <option name="resolveModulePerSourceSet" value="false" />
-        <option name="testRunner" value="PLATFORM" />
+        <option name="useQualifiedModuleNames" value="true" />
       </GradleProjectSettings>
       </GradleProjectSettings>
     </option>
     </option>
   </component>
   </component>

+ 1 - 1
.idea/misc.xml

@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <?xml version="1.0" encoding="UTF-8"?>
 <project version="4">
 <project version="4">
-  <component name="ProjectRootManager" version="2" languageLevel="JDK_1_8" project-jdk-name="1.8" project-jdk-type="JavaSDK">
+  <component name="ProjectRootManager" version="2" languageLevel="JDK_1_8" default="true" project-jdk-name="1.8" project-jdk-type="JavaSDK">
     <output url="file://$PROJECT_DIR$/build/classes" />
     <output url="file://$PROJECT_DIR$/build/classes" />
   </component>
   </component>
   <component name="ProjectType">
   <component name="ProjectType">

+ 2 - 1
app/src/main/AndroidManifest.xml

@@ -47,8 +47,9 @@
 
 
 <!--        <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.wdkl.ncs.android.component.home.activity.WatchRegisterActivity">-->
 <!--        <activity android:name="com.starrtc.demo.demo.SplashActivity">-->
 <!--        <activity android:name="com.starrtc.demo.demo.SplashActivity">-->
+        <activity android:name="com.wdkl.ncs.android.component.home.activity.WatchHome2Activity">-->
             <intent-filter>
             <intent-filter>
                 <action android:name="android.intent.action.MAIN"/>
                 <action android:name="android.intent.action.MAIN"/>
 
 

+ 253 - 128
build.gradle

@@ -1,128 +1,8 @@
-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 = 19
-
-    /**
-     * 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 {
 //buildscript {
 //    /**
 //    /**
 //     * Kotlin统一版本
 //     * Kotlin统一版本
 //     */
 //     */
-//    ext.kotlin_version = '1.2.40'
+//    ext.kotlin_version = '1.3.21'
 //
 //
 //    /**
 //    /**
 //     * Aop编制版本
 //     * Aop编制版本
@@ -147,7 +27,7 @@ task clean(type: Delete) {
 //    /**
 //    /**
 //     * SDK最小支持版本
 //     * SDK最小支持版本
 //     */
 //     */
-//    ext.min_sdk_version = 19
+//    ext.min_sdk_version = 26
 //
 //
 //    /**
 //    /**
 //     * SDK目标支持版本
 //     * SDK目标支持版本
@@ -182,9 +62,132 @@ task clean(type: Delete) {
 //            /**
 //            /**
 //             * 依赖仓储
 //             * 依赖仓储
 //             */
 //             */
+//            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'
+//
+//    /**
+//     * 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 = 17
+//
+//    /**
+//     * 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 {
 //            jcenter()
 //            jcenter()
 //            mavenCentral()
 //            mavenCentral()
 //            google()
 //            google()
+//            /**
+//             * 依赖仓储
+//             */
+//            maven { url 'http://maven.aliyun.com/nexus/content/repositories/google' }
+//            maven { url 'http://maven.aliyun.com/nexus/content/repositories/jcenter'}
+//            maven { url 'http://maven.aliyun.com/nexus/content/groups/public/' }
+//            maven { url 'https://jitpack.io' }
 //        }
 //        }
 //        /**
 //        /**
 //         * Gradle插件
 //         * Gradle插件
@@ -211,9 +214,6 @@ task clean(type: Delete) {
 //         */
 //         */
 //        classpath "org.aspectj:aspectjtools:$aspectj_version"
 //        classpath "org.aspectj:aspectjtools:$aspectj_version"
 //    }
 //    }
-//    repositories {
-//        google()
-//    }
 //}
 //}
 ///**
 ///**
 // * 统一依赖仓储
 // * 统一依赖仓储
@@ -224,9 +224,10 @@ task clean(type: Delete) {
 //        mavenCentral()
 //        mavenCentral()
 //        google()
 //        google()
 //
 //
-//        maven { url 'https://dl.bintray.com/geamtear/maven' }
-//        maven { url "https://jitpack.io" }
-//
+//        maven { url 'http://maven.aliyun.com/nexus/content/repositories/google' }
+//        maven { url 'http://maven.aliyun.com/nexus/content/repositories/jcenter'}
+//        maven { url 'http://maven.aliyun.com/nexus/content/groups/public/' }
+//        maven { url 'https://jitpack.io' }
 //    }
 //    }
 //    tasks.withType(Javadoc) { // 新增
 //    tasks.withType(Javadoc) { // 新增
 //        options.addStringOption('Xdoclint:none', '-quiet')
 //        options.addStringOption('Xdoclint:none', '-quiet')
@@ -240,3 +241,127 @@ task clean(type: Delete) {
 //task clean(type: Delete) {
 //task clean(type: Delete) {
 //    delete rootProject.buildDir
 //    delete rootProject.buildDir
 //}
 //}
+
+
+buildscript {
+    /**
+     * Kotlin统一版本
+     */
+    ext.kotlin_version = '1.2.40'
+
+    /**
+     * 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 = 24
+
+    /**
+     * 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 {
+            /**
+             * 依赖仓储
+             */
+            jcenter()
+            mavenCentral()
+            google()
+        }
+        /**
+         * 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 {
+        google()
+    }
+}
+/**
+ * 统一依赖仓储
+ */
+allprojects {
+    repositories {
+        jcenter()
+        mavenCentral()
+        google()
+
+        maven { url 'https://dl.bintray.com/geamtear/maven' }
+        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
+}

+ 3 - 1
home/src/main/AndroidManifest.xml

@@ -4,6 +4,7 @@
 
 
     <uses-permission android:name="android.permission.DISABLE_KEYGUARD" />
     <uses-permission android:name="android.permission.DISABLE_KEYGUARD" />
     <uses-permission android:name="android.permission.READ_PHONE_STATE" />
     <uses-permission android:name="android.permission.READ_PHONE_STATE" />
+    <uses-permission android:name="android.permission.WAKE_LOCK" />
 
 
     <application
     <application
         android:allowBackup="true"
         android:allowBackup="true"
@@ -13,7 +14,8 @@
         <activity
         <activity
             android:name=".activity.HomeActivity"
             android:name=".activity.HomeActivity"
             android:launchMode="singleTask" />
             android:launchMode="singleTask" />
-        <activity android:name=".activity.WatchHomeActivity" />
+        <activity android:name=".activity.WatchHomeActivity"
+            android:launchMode="singleTask"/>
         <activity android:name=".activity.WatchContactsActivity" />
         <activity android:name=".activity.WatchContactsActivity" />
         <activity android:name=".activity.WatchCallRecordsActivity" />
         <activity android:name=".activity.WatchCallRecordsActivity" />
         <activity android:name=".activity.EventActivity" />
         <activity android:name=".activity.EventActivity" />

+ 4 - 3
home/src/main/code/com/wdkl/ncs/android/component/home/activity/AppUpdateActivity.kt

@@ -85,9 +85,10 @@ class AppUpdateActivity :BaseActivity<AppUpdatePresenter, ActivityAppUpdateBindi
                 override fun onSuccess() {
                 override fun onSuccess() {
                     runOnUiThread {
                     runOnUiThread {
                         showMessage("升级成功")
                         showMessage("升级成功")
-                        //finish()
-                        android.os.Process.killProcess(android.os.Process.myPid())
-                        System.exit(0)
+                        finish()
+                        //有root权限用这个
+//                        android.os.Process.killProcess(android.os.Process.myPid())
+//                        System.exit(0)
                     }
                     }
                 }
                 }
             })
             })

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

@@ -18,6 +18,8 @@ import com.wdkl.ncs.android.middleware.api.ApiManager
 import com.wdkl.ncs.android.middleware.logic.contract.home.WatchHomeActivityContract
 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.logic.presenter.home.WatchHomeActivityPresenter
 import com.wdkl.ncs.android.middleware.model.dos.AppVersionDO
 import com.wdkl.ncs.android.middleware.model.dos.AppVersionDO
+import com.wdkl.ncs.android.middleware.model.dos.DeviceDO
+import com.wdkl.ncs.android.middleware.model.dto.TcpSeverDTO
 import com.wdkl.ncs.android.middleware.model.vo.InteractionVO
 import com.wdkl.ncs.android.middleware.model.vo.InteractionVO
 import com.wdkl.ncs.android.middleware.tcp.TcpClient
 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.EventUtil
@@ -29,6 +31,7 @@ import kotlinx.android.synthetic.main.watch_activity_event.*
 class EventActivity : BaseActivity<WatchHomeActivityPresenter, WatchActivityEventBinding>(), WatchHomeActivityContract.View, View.OnClickListener {
 class EventActivity : BaseActivity<WatchHomeActivityPresenter, WatchActivityEventBinding>(), WatchHomeActivityContract.View, View.OnClickListener {
 
 
 
 
+
     var TAG = EventActivity::class.java.simpleName
     var TAG = EventActivity::class.java.simpleName
 
 
     var tcpModel = TcpModel()
     var tcpModel = TcpModel()
@@ -196,7 +199,11 @@ class EventActivity : BaseActivity<WatchHomeActivityPresenter, WatchActivityEven
 
 
     override fun networkMonitor(state: NetState) {
     override fun networkMonitor(state: NetState) {
     }
     }
+    override fun showData(data: DeviceDO) {
+    }
 
 
+    override fun setTcpServerHost(tcpSeverDTO: TcpSeverDTO) {
+    }
     override fun onClick(p0: View?) {
     override fun onClick(p0: View?) {
         if (interactionVO!!.actionType == TcpType.EVENT.name) {
         if (interactionVO!!.actionType == TcpType.EVENT.name) {
             if (!Constants.ids.equals("")) {
             if (!Constants.ids.equals("")) {

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

@@ -2,6 +2,7 @@ package com.wdkl.ncs.android.component.home.activity
 
 
 import android.content.Intent
 import android.content.Intent
 import android.graphics.Color
 import android.graphics.Color
+import android.os.CountDownTimer
 import android.util.Log
 import android.util.Log
 import android.view.View
 import android.view.View
 import com.alibaba.android.vlayout.DelegateAdapter
 import com.alibaba.android.vlayout.DelegateAdapter
@@ -18,6 +19,7 @@ import com.wdkl.ncs.android.component.home.launch.HomeLaunch
 import com.wdkl.ncs.android.component.nursehome.common.Constants
 import com.wdkl.ncs.android.component.nursehome.common.Constants
 import com.wdkl.ncs.android.lib.base.BaseActivity
 import com.wdkl.ncs.android.lib.base.BaseActivity
 import com.wdkl.ncs.android.lib.utils.AppTool
 import com.wdkl.ncs.android.lib.utils.AppTool
+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.contract.home.WatchActivityContract
 import com.wdkl.ncs.android.middleware.logic.contract.home.WatchCallRecordsFragmentContract
 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.WatchActivityPresenter
@@ -66,6 +68,10 @@ class WatchCallRecordsActivity : BaseActivity<WatchCallRecordsFragmentPresenter,
     var action: String? = null
     var action: String? = null
     var receivedData: WatchContactsVO? = null
     var receivedData: WatchContactsVO? = null
 
 
+    private var CALL_TIMEOUT = 5 //多久可以再次点击
+    //呼叫倒计时
+    lateinit var countDownTimer: CountDownTimer
+    private var isClick = true //是否可点击
 
 
 
 
     override fun getLayId(): Int {
     override fun getLayId(): Int {
@@ -109,11 +115,20 @@ class WatchCallRecordsActivity : BaseActivity<WatchCallRecordsFragmentPresenter,
             call_relyout.visibility = View.VISIBLE
             call_relyout.visibility = View.VISIBLE
             presenter.loadFloor(initiator, 1, 30, Constants.ids.toInt(), customerId.toInt(), -1)
             presenter.loadFloor(initiator, 1, 30, Constants.ids.toInt(), customerId.toInt(), -1)
             call_relyout.setOnClickListener {
             call_relyout.setOnClickListener {
-                Log.i(TAG, "call_relyout click 111")
-                var tcpModel = VoiceUtil.voiceCall(Integer.parseInt(Constants.ids), receivedData!!.deviceId)
-                TcpClient.getInstance().sendMsg(tcpModel.toJson())
+                if (isClick) {
+
+                    Log.i(TAG, "call_relyout click 111")
+                    var tcpModel = VoiceUtil.voiceCall(Integer.parseInt(Constants.ids), receivedData!!.deviceId)
+                    TcpClient.getInstance().sendMsg(tcpModel.toJson())
+
+                    countDownTimer.start()
+                    isClick = false
+                }else{
+                    showMessage("请稍后,请勿频繁点击")
+                }
             }
             }
         }
         }
+        initCountDownTimer()
     }
     }
 
 
     override fun bindEvent() {
     override fun bindEvent() {
@@ -144,6 +159,10 @@ class WatchCallRecordsActivity : BaseActivity<WatchCallRecordsFragmentPresenter,
     }
     }
 
 
     override fun destory() {
     override fun destory() {
+        if(countDownTimer != null){
+            countDownTimer.cancel()
+        }
+
     }
     }
 
 
     override fun renderFloor(data: ArrayList<InteractionVO>) {
     override fun renderFloor(data: ArrayList<InteractionVO>) {
@@ -189,39 +208,51 @@ class WatchCallRecordsActivity : BaseActivity<WatchCallRecordsFragmentPresenter,
     override fun networkMonitor(state: NetState) {
     override fun networkMonitor(state: NetState) {
     }
     }
 
 
+    fun initCountDownTimer() {
+        countDownTimer = object : CountDownTimer(CALL_TIMEOUT * 1000L, 1000) {
+            override fun onTick(millisUntilFinished: Long) {
+
+            }
+
+            override fun onFinish() {
+                isClick = true
+            }
+        }
+    }
+
     @Subscribe(threadMode = ThreadMode.MAIN)
     @Subscribe(threadMode = ThreadMode.MAIN)
     fun onMoonEvent(messageEvent: MessageEvent) {
     fun onMoonEvent(messageEvent: MessageEvent) {
-        if (messageEvent.tag == 1) {
+        if (messageEvent.tag == 1 ) {
             var tcpModel = messageEvent.getMessage() as TcpModel
             var tcpModel = messageEvent.getMessage() as TcpModel
-            //data 是 InteractionVO
+            if( tcpModel.action == TcpAction.VoiceAction.SUCCESS ) {
+
+                //data 是 InteractionVO
 //            var gson = GsonBuilder().setFieldNamingPolicy(FieldNamingPolicy.LOWER_CASE_WITH_UNDERSCORES).create()
 //            var gson = GsonBuilder().setFieldNamingPolicy(FieldNamingPolicy.LOWER_CASE_WITH_UNDERSCORES).create()
 //            var interactionVO = gson.fromJson(tcpModel.data.toString(), InteractionVO::class.java)
 //            var interactionVO = gson.fromJson(tcpModel.data.toString(), InteractionVO::class.java)
-            //界面呈现
-            AppTool.Time.delay(300) {
-                var intent = Intent()
-                //rtc
+                //界面呈现
+                AppTool.Time.delay(100) {
+                    var intent = Intent()
+                    //rtc
 //                intent.setClass(this, RTCVoipAudioActivity::class.java)
 //                intent.setClass(this, RTCVoipAudioActivity::class.java)
 //                intent.putExtra("targetId", receivedData?.deviceSipId)
 //                intent.putExtra("targetId", receivedData?.deviceSipId)
 //                intent.putExtra("TcpModel", tcpModel)
 //                intent.putExtra("TcpModel", tcpModel)
 //                intent.putExtra(RTCVoipAudioActivity.ACTION, RTCVoipAudioActivity.CALL)
 //                intent.putExtra(RTCVoipAudioActivity.ACTION, RTCVoipAudioActivity.CALL)
 //                startActivity(intent)
 //                startActivity(intent)
-                //sip
+                    //sip
 //                intent.setClass(this,SipVoipAudioActivity::class.java)
 //                intent.setClass(this,SipVoipAudioActivity::class.java)
 //                intent.putExtra("targetId", receivedData?.deviceSipId)
 //                intent.putExtra("targetId", receivedData?.deviceSipId)
 //                intent.putExtra("TcpModel",tcpModel)
 //                intent.putExtra("TcpModel",tcpModel)
 //                intent.putExtra(SipVoipAudioActivity().ACTION, SipVoipAudioActivity().CALL)
 //                intent.putExtra(SipVoipAudioActivity().ACTION, SipVoipAudioActivity().CALL)
 //                startActivity(intent)
 //                startActivity(intent)
 
 
-                //webRTC
-                intent.setClass(this,WebRTCVoipAudioActivity::class.java)
-                intent.putExtra("targetId", receivedData?.deviceSipId)
-                intent.putExtra("TcpModel",tcpModel)
-                intent.putExtra(WebRTCVoipAudioActivity().ACTION, WebRTCVoipAudioActivity().CALL)
-                startActivity(intent)
-
-
-
+                    //webRTC
+                    intent.setClass(this, WebRTCVoipAudioActivity::class.java)
+                    intent.putExtra("targetId", receivedData?.deviceSipId)
+                    intent.putExtra("TcpModel", tcpModel)
+                    intent.putExtra(WebRTCVoipAudioActivity().ACTION, WebRTCVoipAudioActivity().CALL)
+                    startActivity(intent)
 
 
+                }
             }
             }
         }
         }
     }
     }

+ 100 - 56
home/src/main/code/com/wdkl/ncs/android/component/home/activity/WatchEventDetailActivity.kt

@@ -2,6 +2,7 @@ package com.wdkl.ncs.android.component.home.activity
 
 
 import android.content.Intent
 import android.content.Intent
 import android.graphics.Color
 import android.graphics.Color
+import android.os.CountDownTimer
 import android.util.Log
 import android.util.Log
 import android.view.View
 import android.view.View
 import android.widget.Toast
 import android.widget.Toast
@@ -29,6 +30,8 @@ import com.wdkl.ncs.android.middleware.api.UrlManager
 import com.wdkl.ncs.android.middleware.logic.contract.home.WatchHomeActivityContract
 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.logic.presenter.home.WatchHomeActivityPresenter
 import com.wdkl.ncs.android.middleware.model.dos.AppVersionDO
 import com.wdkl.ncs.android.middleware.model.dos.AppVersionDO
+import com.wdkl.ncs.android.middleware.model.dos.DeviceDO
+import com.wdkl.ncs.android.middleware.model.dto.TcpSeverDTO
 import com.wdkl.ncs.android.middleware.model.vo.InteractionVO
 import com.wdkl.ncs.android.middleware.model.vo.InteractionVO
 import com.wdkl.ncs.android.middleware.tcp.TcpClient
 import com.wdkl.ncs.android.middleware.tcp.TcpClient
 import com.wdkl.ncs.android.middleware.tcp.channel.DeviceChannel
 import com.wdkl.ncs.android.middleware.tcp.channel.DeviceChannel
@@ -45,17 +48,21 @@ import org.greenrobot.eventbus.Subscribe
 import org.greenrobot.eventbus.ThreadMode
 import org.greenrobot.eventbus.ThreadMode
 
 
 @Router(path = "/event/detail")
 @Router(path = "/event/detail")
-class WatchEventDetailActivity: BaseActivity<WatchHomeActivityPresenter, WatchActivityEventDetailBinding>(), WatchHomeActivityContract.View{
+class WatchEventDetailActivity : BaseActivity<WatchHomeActivityPresenter, WatchActivityEventDetailBinding>(), WatchHomeActivityContract.View {
+
 
 
     var TAG = WatchEventDetailActivity::class.java.getSimpleName()
     var TAG = WatchEventDetailActivity::class.java.getSimpleName()
     //参数自动注入
     //参数自动注入
-    @Autowired(name= "tcpModelStr",required = true)
-    @JvmField var tcpModelStr: String = ""
-
-    var interactionVO:InteractionVO? = null
-    var tcpModel:TcpModel? = null
-
+    @Autowired(name = "tcpModelStr", required = true)
+    @JvmField
+    var tcpModelStr: String = ""
 
 
+    var interactionVO: InteractionVO? = null
+    var tcpModel: TcpModel? = null
+    private var CALL_TIMEOUT = 5 //多久可以再次点击
+    //呼叫倒计时
+    lateinit var countDownTimer: CountDownTimer
+    private var isClick = true //是否可点击
 
 
     override fun getLayId(): Int {
     override fun getLayId(): Int {
         return R.layout.watch_activity_event_detail
         return R.layout.watch_activity_event_detail
@@ -77,30 +84,41 @@ class WatchEventDetailActivity: BaseActivity<WatchHomeActivityPresenter, WatchAc
     }
     }
 
 
 
 
-
     override fun bindDagger() {
     override fun bindDagger() {
         HomeLaunch.component.inject(this)
         HomeLaunch.component.inject(this)
     }
     }
 
 
     override fun bindEvent() {
     override fun bindEvent() {
         back.setOnClickListener {
         back.setOnClickListener {
-//            push("/watch/callrecords", { postcard ->
+            //            push("/watch/callrecords", { postcard ->
 //                postcard.withString("action","UNREAD")
 //                postcard.withString("action","UNREAD")
 //                postcard.withString("customer_id","")
 //                postcard.withString("customer_id","")
-                finish()
+            finish()
 //            })
 //            })
         }
         }
 
 
-        call_relyout.setOnClickListener{
-            Log.e(TAG,"tcpModel 发送的 "+tcpModel?.toJson())
-            var tcpModel:TcpModel?= null
-            if(interactionVO?.actionDirectionType == 1){
-                tcpModel = VoiceUtil.voiceCall(Integer.parseInt(Constants.ids),interactionVO?.fromDeviceId)
+        call_relyout.setOnClickListener {
+            if (isClick) {
+                Log.e(TAG, "tcpModel 发送的 " + tcpModel?.toJson())
+                var tcpModel: TcpModel? = null
+                if (interactionVO?.actionDirectionType == 1) {
+                    tcpModel = VoiceUtil.voiceCall(Integer.parseInt(Constants.ids), interactionVO?.fromDeviceId)
+                } else {
+                    tcpModel = VoiceUtil.voiceCall(Integer.parseInt(Constants.ids), interactionVO?.toDeviceId)
+//            Log.e(TAG,"Constants.ids"+Constants.ids)
+//            Log.e(TAG,"interactionVO?.fromDeviceId"+interactionVO?.fromDeviceId)
+//                 Log.e(TAG,"interactionVO?.toDeviceId"+interactionVO?.toDeviceId)
+//
+//            Log.e(TAG,"interactionVO?.fromDeviceFrameId"+interactionVO?.fromDeviceFrameId)
+//            Log.e(TAG,"interactionVO?.toDeviceFrameId"+interactionVO?.toDeviceFrameId)
+                }
+
+                TcpClient.getInstance().sendMsg(tcpModel?.toJson())
+                countDownTimer.start()
+                isClick = false
             }else{
             }else{
-                tcpModel = VoiceUtil.voiceCall(Integer.parseInt(Constants.ids),interactionVO?.toDeviceId)
+                showMessage("请稍后,请勿频繁点击")
             }
             }
-
-            TcpClient.getInstance().sendMsg(tcpModel?.toJson())
         }
         }
 
 
         event_status_img.setOnClickListener {
         event_status_img.setOnClickListener {
@@ -112,19 +130,19 @@ class WatchEventDetailActivity: BaseActivity<WatchHomeActivityPresenter, WatchAc
                 //todo: 语音播放
                 //todo: 语音播放
 
 
                 if (!Constants.ids.equals("")) {
                 if (!Constants.ids.equals("")) {
-                    if(interactionVO!!.actionEnd  ==null){
+                    if (interactionVO!!.actionEnd == null) {
                         var imUtilTcpModel = ImUtil.imRead(Constants.ids.toInt(), interactionVO!!.fromDeviceId, interactionVO!!.id)
                         var imUtilTcpModel = ImUtil.imRead(Constants.ids.toInt(), interactionVO!!.fromDeviceId, interactionVO!!.id)
                         TcpClient.getInstance().sendMsg(imUtilTcpModel.toJson())
                         TcpClient.getInstance().sendMsg(imUtilTcpModel.toJson())
 //                        var mediaPlayer = MediaPlayer()
 //                        var mediaPlayer = MediaPlayer()
 //                    mediaPlayer.startMediaPlayer( Constants.eth_ip +interactionVO!!.data)
 //                    mediaPlayer.startMediaPlayer( Constants.eth_ip +interactionVO!!.data)
 //                    mediaPlayer.setVolume(0.3f)
 //                    mediaPlayer.setVolume(0.3f)
-                        MediaPlayHelper.getInstance().playUrlMusic(ApiManager.urlManager.device_url +interactionVO!!.data,1f,false)
-                    }else{
-                        MediaPlayHelper.getInstance().playUrlMusic(ApiManager.urlManager.device_url +interactionVO!!.data,1f,false)
+                        MediaPlayHelper.getInstance().playUrlMusic(ApiManager.urlManager.device_url + interactionVO!!.data, 1f, false)
+                    } else {
+                        MediaPlayHelper.getInstance().playUrlMusic(ApiManager.urlManager.device_url + interactionVO!!.data, 1f, false)
                     }
                     }
 
 
 //
 //
-                }else{
+                } else {
                     showMessage("获取不到当给前设备id")
                     showMessage("获取不到当给前设备id")
                 }
                 }
 
 
@@ -133,60 +151,62 @@ class WatchEventDetailActivity: BaseActivity<WatchHomeActivityPresenter, WatchAc
     }
     }
 
 
     override fun destory() {
     override fun destory() {
+        if(countDownTimer != null){
+            countDownTimer.cancel()
+        }
     }
     }
 
 
 
 
-
     override fun init() {
     override fun init() {
 //        AppTool.SystemUI.showNavigationBar(this,true)
 //        AppTool.SystemUI.showNavigationBar(this,true)
 //        AppTool.SystemUI.ImmersiveWithBottomBarColor(this, Color.BLACK)
 //        AppTool.SystemUI.ImmersiveWithBottomBarColor(this, Color.BLACK)
 
 
-
+        initCountDownTimer()
         Log.i(TAG, "参数 tcpModelStr : " + tcpModelStr)
         Log.i(TAG, "参数 tcpModelStr : " + tcpModelStr)
         tcpModel = TcpModel.getModelByJson(tcpModelStr)
         tcpModel = TcpModel.getModelByJson(tcpModelStr)
         //var gson = GsonBuilder().setFieldNamingPolicy(FieldNamingPolicy.LOWER_CASE_WITH_UNDERSCORES).create()
         //var gson = GsonBuilder().setFieldNamingPolicy(FieldNamingPolicy.LOWER_CASE_WITH_UNDERSCORES).create()
         interactionVO = Gson().fromJson(tcpModel?.data.toString(), InteractionVO::class.java)
         interactionVO = Gson().fromJson(tcpModel?.data.toString(), InteractionVO::class.java)
 
 
-        if (interactionVO!=null) {
+        if (interactionVO != null) {
             tv_frame_name.setText(interactionVO?.fromFrameFullName)
             tv_frame_name.setText(interactionVO?.fromFrameFullName)
             baby_mother_name.setText(interactionVO?.fromMemberName)
             baby_mother_name.setText(interactionVO?.fromMemberName)
 
 
-            if (tcpModel?.type == TcpType.IM){
+            if (tcpModel?.type == TcpType.IM) {
                 event_text.setText("语音留言")
                 event_text.setText("语音留言")
-                event_status_img.setImageResource(R.drawable.icon_hd_live)
+                event_status_img.setImageResource(com.starrtc.demo.R.drawable.icon_hd_live)
                 if (interactionVO?.actionEnd != null) {
                 if (interactionVO?.actionEnd != null) {
-                    event_end_text.setText(TimeTransition().stampToDate(interactionVO!!.actionEnd*1000))
+                    event_end_text.setText(TimeTransition().stampToDate(interactionVO!!.actionEnd * 1000))
                     //event_status_img.isEnabled = false
                     //event_status_img.isEnabled = false
                     //event_status_img.setImageResource(com.starrtc.demo.R.drawable.icon_hd_live_item)
                     //event_status_img.setImageResource(com.starrtc.demo.R.drawable.icon_hd_live_item)
                 } /*else {
                 } /*else {
                     event_status_img.setImageResource(com.starrtc.demo.R.drawable.icon_hd_live)
                     event_status_img.setImageResource(com.starrtc.demo.R.drawable.icon_hd_live)
                 }*/
                 }*/
-            } else if (tcpModel?.type == TcpType.EVENT){
+            } else if (tcpModel?.type == TcpType.EVENT) {
                 event_text.setText(interactionVO?.data)
                 event_text.setText(interactionVO?.data)
 
 
                 if (interactionVO?.actionEnd != null) {
                 if (interactionVO?.actionEnd != null) {
-                    event_end_text.setText(TimeTransition().stampToDate(interactionVO!!.actionEnd*1000))
+                    event_end_text.setText(TimeTransition().stampToDate(interactionVO!!.actionEnd * 1000))
                     event_status_img.isEnabled = false
                     event_status_img.isEnabled = false
-                    event_status_img.setImageResource(R.drawable.icon_switch_on)
+                    event_status_img.setImageResource(com.starrtc.demo.R.drawable.icon_switch_on)
                 }
                 }
-            }else {
+            } else {
                 call_out_linlyout.visibility = View.GONE
                 call_out_linlyout.visibility = View.GONE
                 call_relyout.visibility = View.VISIBLE
                 call_relyout.visibility = View.VISIBLE
-                if(tcpModel?.type == TcpType.VOICE){
-                      //todo 腕表没有按主机这边设计 没数据
+                if (tcpModel?.type == TcpType.VOICE) {
+                    //todo 腕表没有按主机这边设计 没数据
                     if (interactionVO?.actionEnd != null) {
                     if (interactionVO?.actionEnd != null) {
                         //判断是呼入还是呼出 1 分机到主机 2主机到分机
                         //判断是呼入还是呼出 1 分机到主机 2主机到分机
-                        if(interactionVO?.actionDirectionType == 1){
+                        if (interactionVO?.actionDirectionType == 1) {
                             event_text.setText("语音呼入已接")
                             event_text.setText("语音呼入已接")
-                        }else if(interactionVO?.actionDirectionType == 2 || interactionVO?.actionDirectionType == 3){
+                        } else if (interactionVO?.actionDirectionType == 2 || interactionVO?.actionDirectionType == 3) {
                             event_text.setText("语音呼出已接")
                             event_text.setText("语音呼出已接")
                         }
                         }
 
 
-                    }else{
+                    } else {
                         //判断是呼入还是呼出 1 分机到主机 2主机到分机
                         //判断是呼入还是呼出 1 分机到主机 2主机到分机
-                        if(interactionVO?.actionDirectionType == 1){
+                        if (interactionVO?.actionDirectionType == 1) {
                             event_text.setText("语音呼入未接")
                             event_text.setText("语音呼入未接")
-                        }else if(interactionVO?.actionDirectionType == 2 || interactionVO?.actionDirectionType == 3){
+                        } else if (interactionVO?.actionDirectionType == 2 || interactionVO?.actionDirectionType == 3) {
                             event_text.setText("语音呼出未接")
                             event_text.setText("语音呼出未接")
                         }
                         }
 
 
@@ -195,10 +215,10 @@ class WatchEventDetailActivity: BaseActivity<WatchHomeActivityPresenter, WatchAc
 //                    event_text.setText("语音呼叫")
 //                    event_text.setText("语音呼叫")
 
 
 
 
-                }else if(tcpModel?.type == TcpType.VIDEO){
+                } else if (tcpModel?.type == TcpType.VIDEO) {
 
 
                     event_text.setText("视频呼叫")
                     event_text.setText("视频呼叫")
-                }else if(tcpModel?.type == TcpType.SOS){
+                } else if (tcpModel?.type == TcpType.SOS) {
                     event_text.setText("SOS紧急呼叫")
                     event_text.setText("SOS紧急呼叫")
                 }
                 }
             }
             }
@@ -206,29 +226,45 @@ class WatchEventDetailActivity: BaseActivity<WatchHomeActivityPresenter, WatchAc
     }
     }
 
 
 
 
+    fun initCountDownTimer() {
+        countDownTimer = object : CountDownTimer(CALL_TIMEOUT * 1000L, 1000) {
+            override fun onTick(millisUntilFinished: Long) {
+
+            }
+
+            override fun onFinish() {
+                isClick = true
+            }
+        }
+    }
+    override fun showData(data: DeviceDO) {
+    }
+
+    override fun setTcpServerHost(tcpSeverDTO: TcpSeverDTO) {
+    }
 
 
     @Subscribe(threadMode = ThreadMode.MAIN)
     @Subscribe(threadMode = ThreadMode.MAIN)
-    fun onMoonEvent(messageEvent: MessageEvent){
-        if (messageEvent.tag==0){
+    fun onMoonEvent(messageEvent: MessageEvent) {
+        if (messageEvent.tag == 0) {
             var resTcpModel = messageEvent.getMessage() as TcpModel
             var resTcpModel = messageEvent.getMessage() as TcpModel
-            if (resTcpModel.type == TcpType.DATA && resTcpModel.action == TcpAction.DataAction.INTERACTION){
-                if (resTcpModel.data!=null) {
+            if (resTcpModel.type == TcpType.DATA && resTcpModel.action == TcpAction.DataAction.INTERACTION) {
+                if (resTcpModel.data != null) {
 
 
                     val responseInteractionVO = Gson().fromJson<InteractionVO>(resTcpModel.getData().toString(), InteractionVO::class.java)
                     val responseInteractionVO = Gson().fromJson<InteractionVO>(resTcpModel.getData().toString(), InteractionVO::class.java)
 
 
-                    if (tcpModel?.type == TcpType.IM){
-                        event_status_img.setImageResource(R.drawable.icon_hd_live_item)
+                    if (tcpModel?.type == TcpType.IM) {
+                        event_status_img.setImageResource(com.starrtc.demo.R.drawable.icon_hd_live_item)
                         Toast.makeText(this, "已播放", Toast.LENGTH_SHORT)
                         Toast.makeText(this, "已播放", Toast.LENGTH_SHORT)
-                    } else if (tcpModel?.type == TcpType.EVENT){
-                        event_status_img.setImageResource(R.drawable.icon_switch_on)
+                    } else if (tcpModel?.type == TcpType.EVENT) {
+                        event_status_img.setImageResource(com.starrtc.demo.R.drawable.icon_switch_on)
                         Toast.makeText(this, "已响应", Toast.LENGTH_SHORT)
                         Toast.makeText(this, "已响应", Toast.LENGTH_SHORT)
                     }
                     }
 
 
                     event_end_text.setText(TimeTransition().stampToDate(responseInteractionVO.actionEnd * 1000))
                     event_end_text.setText(TimeTransition().stampToDate(responseInteractionVO.actionEnd * 1000))
                 }
                 }
             }
             }
-        }else if(messageEvent.tag == 1){
-           var tcpModel = messageEvent.getMessage() as TcpModel
+        } else if (messageEvent.tag == 1) {
+            var tcpModel = messageEvent.getMessage() as TcpModel
 //            //rtc
 //            //rtc
 //            var intent = Intent()
 //            var intent = Intent()
 //            intent.setClass(this,RTCVoipAudioActivity::class.java)
 //            intent.setClass(this,RTCVoipAudioActivity::class.java)
@@ -237,7 +273,7 @@ class WatchEventDetailActivity: BaseActivity<WatchHomeActivityPresenter, WatchAc
 //            intent.putExtra(RTCVoipAudioActivity.ACTION, RTCVoipAudioActivity.CALL)
 //            intent.putExtra(RTCVoipAudioActivity.ACTION, RTCVoipAudioActivity.CALL)
 //            startActivity(intent)
 //            startActivity(intent)
 
 
-               //sip
+            //sip
 //            var intent = Intent()
 //            var intent = Intent()
 //            intent.setClass(this,SipVoipAudioActivity::class.java)
 //            intent.setClass(this,SipVoipAudioActivity::class.java)
 //            intent.putExtra("targetId", interactionVO?.fromSipId)
 //            intent.putExtra("targetId", interactionVO?.fromSipId)
@@ -247,9 +283,17 @@ class WatchEventDetailActivity: BaseActivity<WatchHomeActivityPresenter, WatchAc
 
 
             //sip
             //sip
             var intent = Intent()
             var intent = Intent()
-            intent.setClass(this,WebRTCVoipAudioActivity::class.java)
-            intent.putExtra("targetId", interactionVO?.fromSipId)
-            intent.putExtra("TcpModel",tcpModel)
+            intent.setClass(this, WebRTCVoipAudioActivity::class.java)
+
+//            Log.e(TAG,"interactionVO?.actionDirectionType"+interactionVO?.actionDirectionType)
+//            Log.e(TAG,"interactionVO?.fromSipId"+interactionVO?.fromSipId)
+//            Log.e(TAG,"interactionVO?.toSipId"+interactionVO?.toSipId)
+            if(interactionVO?.actionDirectionType == 1){ //呼入
+                intent.putExtra("targetId", interactionVO?.fromSipId)
+            }else { //呼出
+                intent.putExtra("targetId", interactionVO?.toSipId)
+            }
+            intent.putExtra("TcpModel", tcpModel)
             intent.putExtra(WebRTCVoipAudioActivity().ACTION, WebRTCVoipAudioActivity().CALL)
             intent.putExtra(WebRTCVoipAudioActivity().ACTION, WebRTCVoipAudioActivity().CALL)
             startActivity(intent)
             startActivity(intent)
 
 

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

@@ -0,0 +1,656 @@
+package com.wdkl.ncs.android.component.home.activity
+
+import android.Manifest
+import android.content.BroadcastReceiver
+import android.content.Context
+import android.content.Intent
+import android.content.IntentFilter
+import android.graphics.Color
+import android.net.wifi.WifiManager
+import android.os.Handler
+import android.telephony.PhoneStateListener
+import android.telephony.SignalStrength
+import android.telephony.TelephonyManager
+import android.text.TextUtils
+import android.util.Log
+import android.view.View
+import com.enation.javashop.android.jrouter.external.annotation.Router
+import com.enation.javashop.net.engine.model.NetState
+import com.enation.javashop.net.engine.plugin.permission.RxPermissions
+import com.google.gson.Gson
+import com.starrtc.demo.demo.service.KeepLiveService
+import com.starrtc.demo.utils.AEvent
+import com.vvsip.ansip.IVvsipServiceListener
+import com.vvsip.ansip.VvsipCall
+import com.wdkl.core.consts.Urls
+import com.wdkl.core.socket.IUserState
+import com.wdkl.core.socket.SocketManager
+import com.wdkl.core.voip.VoipEvent
+import com.wdkl.ncs.android.component.home.BuildConfig
+import com.wdkl.ncs.android.component.home.R
+import com.wdkl.ncs.android.component.home.SOSEmergencyCallActivity
+import com.wdkl.ncs.android.component.home.SipUtil.SipCallBack
+import com.wdkl.ncs.android.component.home.SipUtil.SipHelper
+import com.wdkl.ncs.android.component.home.SipUtil.SipHelperUtil
+import com.wdkl.ncs.android.component.home.SipUtil.SipHelperUtil2
+import com.wdkl.ncs.android.component.home.broadcast.BatteryBroadcastReceiver
+import com.wdkl.ncs.android.component.home.databinding.WatchActivityHomeBinding
+import com.wdkl.ncs.android.component.home.launch.HomeLaunch
+import com.wdkl.ncs.android.component.home.service.APPService
+import com.wdkl.ncs.android.component.home.service.TcpHandleService
+import com.wdkl.ncs.android.component.home.util.NetHelper
+import com.wdkl.ncs.android.component.home.util.SpeechUtil
+import com.wdkl.ncs.android.component.home.util.Util
+import com.wdkl.ncs.android.component.nursehome.common.Constants
+import com.wdkl.ncs.android.lib.base.BaseActivity
+import com.wdkl.ncs.android.lib.base.BaseApplication
+import com.wdkl.ncs.android.lib.utils.AppTool
+import com.wdkl.ncs.android.lib.utils.joinManager
+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.model.dos.AppVersionDO
+import com.wdkl.ncs.android.middleware.model.dos.DeviceDO
+import com.wdkl.ncs.android.middleware.model.dto.TcpSeverDTO
+
+import com.wdkl.ncs.android.middleware.tcp.TcpClient
+
+import com.wdkl.ncs.android.middleware.model.vo.InteractionVO
+import com.wdkl.ncs.android.middleware.tcp.channel.VoiceUtil
+import com.wdkl.ncs.android.middleware.tcp.dto.TcpModel
+import com.wdkl.ncs.android.middleware.tcp.enums.TcpAction
+import com.wdkl.ncs.android.middleware.tcp.enums.TcpType
+import com.wdkl.ncs.android.middleware.utils.MessageEvent
+import com.wdkl.skywebrtc.SkyEngineKit
+import com.wdkl.skywebrtc.except.NotInitializedException
+import io.reactivex.Observable
+import kotlinx.android.synthetic.main.watch_activity_home.*
+import kotlinx.android.synthetic.main.watch_activity_home.battery_warning_tv
+import kotlinx.android.synthetic.main.watch_activity_home.call_records_linlyout
+import kotlinx.android.synthetic.main.watch_activity_home.customer_list_linlyout
+import kotlinx.android.synthetic.main.watch_activity_home.electric_quantity_tv
+import kotlinx.android.synthetic.main.watch_activity_home.list_item_img_icon_num
+import kotlinx.android.synthetic.main.watch_activity_home.other_linyout
+import kotlinx.android.synthetic.main.watch_activity_home.sip_state_tv
+import kotlinx.android.synthetic.main.watch_activity_home.state_linlyout
+import kotlinx.android.synthetic.main.watch_activity_home.user_nume_linlyout
+import kotlinx.android.synthetic.main.watch_activity_home.watch_name_tv
+import kotlinx.android.synthetic.main.watch_activity_home.watch_role_name_tv
+import kotlinx.android.synthetic.main.watch_activity_home.wifi_rssi_tv
+import kotlinx.android.synthetic.main.watch_activity_home2.*
+import kotlinx.android.synthetic.main.watch_activity_register.*
+import org.greenrobot.eventbus.Subscribe
+import org.greenrobot.eventbus.ThreadMode
+import java.util.*
+import kotlin.collections.ArrayList
+import kotlin.math.log
+
+@Router(path = "/watch/home")
+class WatchHome2Activity : BaseActivity<WatchHomeActivityPresenter, WatchActivityHomeBinding>(), WatchHomeActivityContract.View, View.OnClickListener, View.OnLongClickListener,
+        SipCallBack, IVvsipServiceListener, IUserState {
+
+
+    var TAG = WatchHome2Activity::class.java.getSimpleName()
+
+    //监听网络变化
+    lateinit var wifiManager: WifiManager
+    lateinit var teleManager: TelephonyManager
+    lateinit var wifiReceiver: WifiReceiver
+    private var netType: Int = -1
+
+    lateinit var batteryBroadcastReceiver: BatteryBroadcastReceiver
+
+
+    override fun getLayId(): Int {
+        return R.layout.watch_activity_home2
+    }
+
+    override fun bindDagger() {
+        HomeLaunch.component.inject(this)
+    }
+
+    override fun init() {
+//        AppTool.SystemUI.showNavigationBar(this,false)
+//        AppTool.SystemUI.ImmersiveWithBottomBarColor(this, Color.BLACK)
+
+        presenter.loadTcpServerHost()
+
+        requestPermissions()
+
+
+    }
+
+    private fun requestPermissions() {
+        Observable.just("").compose(RxPermissions(this).ensure(Manifest.permission.CAMERA,
+                Manifest.permission.READ_EXTERNAL_STORAGE,
+                Manifest.permission.WRITE_EXTERNAL_STORAGE,
+                Manifest.permission.ACCESS_WIFI_STATE,
+                Manifest.permission.BLUETOOTH,
+                Manifest.permission.RECORD_AUDIO,
+                Manifest.permission.READ_PHONE_STATE)).subscribe {
+            if (it) {
+                Constants.imei = Util().getIMEI(this)
+                Log.e(TAG, "IMEI " + Util().getIMEI(this))
+
+                Constants.mac = NetHelper.getInstance().macAddress
+                //Constants.mac = "4C:C0:0A:8E:D6:BB"
+                Log.e(TAG, "mac " + Constants.mac)
+                tv_mac_addr.text = "MAC地址: " + Constants.mac + "\n" + "IMEI号:" + Constants.imei
+
+//                presenter.loadData(Constants.mac)//传Mac
+                presenter.loadData(Constants.imei)// 传imei
+            } else {
+                showMessage("请重新授权,进入App")
+                requestPermissions()
+            }
+        }.joinManager(disposableManager)
+
+
+    }
+
+    private fun regReceiver() {
+        wifiReceiver = WifiReceiver()
+        val intentFilter = IntentFilter()
+        intentFilter.addAction(WifiManager.RSSI_CHANGED_ACTION)
+        registerReceiver(wifiReceiver, intentFilter)
+    }
+
+    override fun userLogin() {
+        Log.e(TAG, "webrtc 注册完成")
+        sip_state_tv.setBackgroundColor(Color.parseColor("#00FFFF"))
+        // webRTC呼叫测试
+//        var room = UUID.randomUUID().toString() + System.currentTimeMillis()
+//        var gEngineKit:SkyEngineKit? = null
+//        try {
+//            SkyEngineKit.init(VoipEvent()) //重新初始化
+//          gEngineKit = SkyEngineKit.Instance()
+//        } catch (e: NotInitializedException) {
+//            SkyEngineKit.init(VoipEvent()) //重新初始化
+//            try {
+//                gEngineKit = SkyEngineKit.Instance()
+//            } catch (ex: NotInitializedException) {
+//            }
+//        }
+//        val b = gEngineKit?.startOutCall(applicationContext, room, "4000000210", true)
+
+    }
+
+    override fun userLogout() {
+        sip_state_tv.setBackgroundColor(Color.parseColor("#FF0000"))
+        Log.e(TAG, "webrtc 注册失败")
+    }
+
+    private fun unRegReceiver() {
+        unregisterReceiver(wifiReceiver)
+    }
+
+    override fun bindEvent() {
+        customer_list_linlyout.setOnClickListener(this)
+        call_records_linlyout.setOnClickListener(this)
+        user_nume_linlyout.setOnClickListener(this)
+        state_linlyout.setOnClickListener(this)
+        user_nume_linlyout.setOnLongClickListener(this)
+        other_linyout.setOnClickListener(this)
+    }
+
+    override fun destory() {
+        unRegReceiver()
+        SpeechUtil.getInstance().release()
+//        SipHelperUtil.getInstance(this).unRegisterSip()
+//        SipHelper.getInstance().unRegisterSip()
+
+        //注销webRTC
+        SocketManager.getInstance().unConnect()
+
+        if (batteryBroadcastReceiver != null) {
+            unregisterReceiver(batteryBroadcastReceiver)
+        }
+    }
+
+    override fun render(appInfo: AppVersionDO) {
+        Log.d("AppUpdate", "loadAppVersion111 =====>>  version_code: " + appInfo.versionCode + ", path: " + appInfo.appPath)
+        val newAppVersion = appInfo.versionCode.substring(1)
+        Log.d("AppUpdate", "loadAppVersion222 =====>>  newAppVersion: " + newAppVersion + ", curAppVersion: " + BuildConfig.VERSION_NAME)
+        showMessage("获取版本成功,当前版本: " + BuildConfig.VERSION_NAME + ", 服务器版本: " + newAppVersion)
+
+        //服务器版本和当前版本不一致才做升级操作
+        if (!BuildConfig.VERSION_NAME.equals(newAppVersion)) {
+            Constants.APP_PATH = appInfo.appPath
+            AppTool.Time.delay(200) {
+                push("/callingbed/update")
+            }
+        }
+    }
+
+    fun checkAppVersion() {
+        Constants.APP_PATH = ""
+        //获取APP版本信息,7寸分机type=204
+        if (Constants.part_id != null) {
+            presenter.getAppVersion(Constants.part_id, 7)
+        }
+        Log.d("AppUpdate", "checkAppVersion =====>>  Constant.PART_ID: " + Constants.part_id)
+    }
+
+    /**
+     * 返回的设备信息
+     */
+    override fun showData(data: DeviceDO) {
+        watch_activity_register_layout.visibility = View.GONE
+        watch_activity_home_linyout.visibility = View.VISIBLE
+
+        Log.e(TAG, "收到返回的设备信息 ")
+        Constants.part_id = data.partId
+        Constants.ids = "" + data.id
+        Constants.sip_id = data.sipId
+        Constants.eth_ip = "192.168.1.138:8006/"
+        Constants.sip_ip = "192.168.1.162"
+        Constants.sip_id = data.sipId
+        Constants.sip_password = data.sipPassword
+        Constants.user_name = data.memberName
+        Constants.user_role_name = data.name
+
+        if (TextUtils.isEmpty(Constants.ids) || TextUtils.isEmpty(Constants.sip_id) || TextUtils.isEmpty(Constants.user_name)
+                || TextUtils.isEmpty(Constants.user_role_name)) {
+            showMessage("初始化数据时服务器返回数据不全,请联系管理员")
+            tv_feedback_device_info.text = "初始化数据时服务器返回数据不全,请联系管理员"
+            return
+        } else if (TextUtils.isEmpty(Constants.tcp_server)) {
+            showMessage("初始化tcp连接数据为null")
+            tv_feedback_device_info.text = "初始化tcp连接数据为null"
+            return
+        }
+
+        //这里的是视频通话有关的
+        AEvent.setHandler(Handler())
+        //这里的是视频通话有关的
+
+//        initSDK("000100")
+        initSDK(data.sipId)
+        initInterfaceData()
+        showMessage("初始化完成")
+    }
+
+    /**
+     * 返回的tcp信息
+     */
+    override fun setTcpServerHost(tcpSeverDTO: TcpSeverDTO) {
+        Constants.tcp_server = tcpSeverDTO.publicIp
+        Constants.tcp_port = tcpSeverDTO.tcpPort
+        Constants.heart_beat = tcpSeverDTO.readerIdleTime
+
+        startConnectTcpServer()
+        showMessage("开始连接TCP服务器...")
+
+    }
+
+    private fun startConnectTcpServer() {
+        Thread(Runnable {
+            run {
+                //TcpClient.getInstance().init("192.168.1.138", 5080, 9)
+                //TcpClient.getInstance().init("47.106.200.55", 5080, 9)
+
+                TcpClient.getInstance().init(Constants.tcp_server, Constants.tcp_port, Constants.heart_beat)
+            }
+        }).start()
+    }
+
+    private fun initSDK(DeviceSipId: String) {
+        val intent = Intent(this, KeepLiveService::class.java)
+        intent.putExtra("DeviceSipId", DeviceSipId)
+        startService(intent)
+
+        val intent2 = Intent(this, TcpHandleService::class.java)
+        startService(intent2)
+
+
+        val intent3 = Intent(this, APPService::class.java)
+        startService(intent3)
+
+
+//        val intent2 = Intent(this, RTCKeepLiveService::class.java)
+//        startService(intent2)
+    }
+
+    /**
+     * 初始化界面数据
+     */
+    fun initInterfaceData() {
+        watch_name_tv.text = Constants.user_name
+
+        if (Constants.user_role_name!!.contains("腕表")) {
+            watch_role_name_tv.text = Constants.user_role_name!!.substring(0, (Constants.user_role_name)!!.indexOf("腕表"))
+        } else {
+            watch_role_name_tv.text = Constants.user_role_name
+        }
+
+        //开始ping网络,30秒ping一次
+//        NetHelper.startNetCheck()
+//        //SIP准备工作
+//        initSip()
+        //WEBRTC 语音初始化
+        // 添加登录回调
+        SocketManager.getInstance().addUserStateCallback(this)
+        // 连接socket:登录
+        SocketManager.getInstance().connect(Urls.WS, Constants.sip_id, 0)
+
+        Log.e(TAG, "Urls.WS " + Urls.WS + " sip_id " + Constants.sip_id)
+
+        wifiManager = (applicationContext.getSystemService(Context.WIFI_SERVICE)) as WifiManager
+        teleManager = (applicationContext.getSystemService(Context.TELEPHONY_SERVICE)) as TelephonyManager
+
+        netType = NetHelper.getInstance().getNetworkState(applicationContext)
+        Log.e(TAG, "wzlll 网络类型:" + netType)
+        if (netType == NetHelper.NETWORK_2G || netType == NetHelper.NETWORK_3G || netType == NetHelper.NETWORK_4G) {
+            if (teleManager != null) {
+                teleManager.listen(object : PhoneStateListener() {
+                    override fun onSignalStrengthsChanged(signalStrength: SignalStrength) {
+                        super.onSignalStrengthsChanged(signalStrength)
+                        val asu = signalStrength.gsmSignalStrength
+                        val lastSignal = -113 + 2 * asu;
+                        if (lastSignal > 0) {
+                            var mobileNetworkSignal = lastSignal
+                        }
+                        Log.e(TAG, "wzlll 数据连接信号强度:" + lastSignal)
+                    }
+                }, PhoneStateListener.LISTEN_SIGNAL_STRENGTHS);
+            }
+        }
+        regReceiver()
+
+        batteryBroadcastReceiver = BatteryBroadcastReceiver(electric_quantity_tv)
+
+        val intentFilter = IntentFilter()
+        intentFilter.addAction(Intent.ACTION_BATTERY_CHANGED)
+        registerReceiver(batteryBroadcastReceiver, intentFilter)
+
+        //TTS初始化
+        SpeechUtil.getInstance().init(BaseApplication.appContext)
+        SpeechUtil.getInstance().startSpeechThread()
+
+        //检查版本
+//        checkAppVersion()
+
+    }
+
+
+    override fun onError(message: String, type: Int) {
+    }
+
+    override fun complete(message: String, type: Int) {
+    }
+
+    override fun start() {
+    }
+
+    override fun networkMonitor(state: NetState) {
+    }
+
+    private fun initSip() {
+
+
+        //=============================================Sip启动服务===================================//
+        SipHelperUtil.getInstance(this).sipStartService(Constants.sip_ip, Constants.sip_id, Constants.sip_password)
+        //=============================================SIP状态回调===================================//
+        SipHelperUtil.getInstance(this).setSipCallBack(this)
+        //=============================================SIP服务监听===================================//
+        SipHelperUtil.getInstance(this).obtainSipInfo()
+
+//        SipHelper.getInstance().sipStartService()
+//        SipHelper.getInstance().initSip(this, Constants.sip_ip,Constants.sip_id,Constants.sip_password)
+//        SipHelper.getInstance().setSipCallBack(this)
+//        SipHelper.getInstance().setSipListner(this)
+    }
+
+
+    /**
+     * sip开始通话    ------------------sip回调操作----------------------
+     */
+    override fun startCall(sipAddress: String?) {
+        SipHelperUtil.getInstance(this).startCall(sipAddress)
+    }
+
+    /**
+     * sip自动接听
+     */
+    override fun autoTalking() {
+        SipHelperUtil.getInstance(this).autoTalking()
+    }
+
+    /**
+     * sip结束通话
+     */
+    override fun endCall() {
+        SipHelperUtil.getInstance(this).endCall()
+    }
+
+    override fun onNewVvsipCallEvent(call: VvsipCall?) {
+        SipHelperUtil.getInstance(this).addCallObject(call)
+    }
+
+    override fun onRemoveVvsipCallEvent(call: VvsipCall?) {
+        SipHelperUtil.getInstance(this).removeCallObject(call)
+    }
+
+    override fun onStatusVvsipCallEvent(call: VvsipCall?) {
+    }
+
+    override fun onRegistrationEvent(rid: Int, remote_uri: String?, code: Int, reason: String?) {
+    }
+
+    /**
+     * 监听
+     */
+    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 -> {
+                var intent = Intent(this, WatchCallRecordsActivity::class.java)
+                intent.putExtra("action", "UNREAD")
+                intent.putExtra("customer_id", "")
+                startActivity(intent)
+
+            }
+            R.id.state_linlyout -> {
+
+            }
+
+            R.id.other_linyout -> {
+                val intent = Intent(this, WatchUserSettingActivity::class.java)
+                startActivity(intent)
+            }
+        }
+    }
+
+    /**
+     * 长按进入
+     */
+    override fun onLongClick(p0: View): Boolean {
+        when (p0.id) {
+            R.id.user_nume_linlyout -> {
+//                val intent = Intent(this, WatchUserSettingActivity::class.java)
+//                startActivity(intent)
+            }
+        }
+        return true
+    }
+
+
+    // ====================================== 处理tcp
+    var calling: Boolean = false
+
+    @Subscribe(threadMode = ThreadMode.MAIN)
+    fun onMoonEvent(messageEvent: MessageEvent) {
+//        Log.e(TAG,""+messageEvent.tag)
+//        var tcpModels = messageEvent.getMessage() as TcpModel
+//        Log.e(TAG,""+tcpModels.getAction())
+        if (messageEvent.tag == 14) {
+            //唤醒屏幕并解锁屏幕
+            Util().wakeUpAndUnlock(this)
+
+        } else if (messageEvent.tag == Constants.EVENT_TCP_APP_UPDATE) {
+            //更新APP
+            checkAppVersion()
+        } else if (messageEvent.tag == Constants.EVENT_SIP_REGISTER_STATUS) {
+            var message = messageEvent.getMessage() as String
+            Log.e(TAG, "收到sip註冊消息 " + message)
+            runOnUiThread {
+                if (message.equals(SipHelperUtil.REGISTERING)) {
+                    sip_state_tv.setBackgroundColor(Color.parseColor("#FFFF00"))
+                } else if (message.equals(SipHelperUtil.REGISTERFAIL)) {
+                    sip_state_tv.setBackgroundColor(Color.parseColor("#FF0000"))
+                } else if (message.equals(SipHelperUtil.REGISTERCOM)) {
+                    sip_state_tv.setBackgroundColor(Color.parseColor("#00FFFF"))
+                }
+            }
+        } else if (messageEvent.tag == Constants.EVENT_INTERNETPING) {
+            SipHelperUtil.getInstance(this).obtainSipInfo()
+
+        } else if (messageEvent.tag == Constants.EVENT_UNTREATED_QUANTITY) {
+            var message = messageEvent.getMessage() as ArrayList<InteractionVO>
+            list_item_img_icon_num.text = "" + message.size
+
+        } else if (messageEvent.tag == Constants.EVENT_WIFI_RSSI) {
+            var message = messageEvent.getMessage() as Int
+            if (10 < message && message < 20) {
+                electric_quantity_tv.text = "" + message
+                battery_warning_tv.setTextColor(Color.parseColor("#FF3030"))
+                battery_warning_tv.visibility = View.VISIBLE
+                battery_warning_tv.text = "低电量,请注意充电"
+
+            } else if (10 > message) {
+                electric_quantity_tv.text = "" + message
+                battery_warning_tv.setTextColor(Color.parseColor("#8B2323"))
+                battery_warning_tv.visibility = View.VISIBLE
+                battery_warning_tv.text = "电量过低,请充电"
+            } else {
+                battery_warning_tv.visibility = View.GONE
+                electric_quantity_tv.text = "" + message
+            }
+
+
+        } else if (messageEvent.tag == 0) {
+            //唤醒屏幕并解锁屏幕
+            Util().wakeUpAndUnlock(this)
+
+            var tcpModel = messageEvent.getMessage() as TcpModel
+            var responseTcpModel: TcpModel
+            Log.e(TAG, "" + tcpModel.getType() + " " + tcpModel.getAction())
+            when (tcpModel.getType()) {
+                TcpType.CALLBACK -> if (tcpModel.getAction() === TcpAction.CallbackAction.SUCCESS) {
+                    //todo: 刷新呼叫记录列表
+
+                } else if (tcpModel.getAction() === TcpAction.CallbackAction.FAILED) {
+                    //呼叫失败
+                }
+                TcpType.VOICE -> if (tcpModel.getAction() === TcpAction.VoiceAction.CALL) { //语音呼入
+                    val interactionVO = Gson().fromJson<InteractionVO>(tcpModel.getData().toString(), InteractionVO::class.java)
+                    //判断当前是否通话
+                    // 通话中
+                    if (calling) {
+                        responseTcpModel = VoiceUtil.voiceCalling(tcpModel.getToId(), tcpModel.getFromId(), interactionVO.getId())
+                        //给服务器发送正在通话中 tcp
+                        TcpClient.getInstance().sendMsg(responseTcpModel.toJson())
+                    } else {
+                        Log.e(TAG, "启动接听界面")
+                        responseTcpModel = VoiceUtil.voiceSuccess(tcpModel.getToId(), tcpModel.getFromId(), interactionVO.getId())
+                        TcpClient.getInstance().sendMsg(responseTcpModel.toJson())
+
+                        //界面呈现
+                        AppTool.Time.delay(300) {
+                            //rtc
+//                            var intent = Intent()
+//                            intent.setClass(this, RTCVoipAudioRingingActivity::class.java)
+//                            intent.putExtra("targetId", interactionVO.fromSipId)
+//                            intent.putExtra("TcpModel", tcpModel)
+//                            startActivity(intent)
+
+                            //sip
+//                            var intent = Intent()
+//                            intent.setClass(this, SipVoipAudioRingingActivity::class.java)
+//                            intent.putExtra("targetId", interactionVO.fromSipId)
+//                            intent.putExtra("TcpModel", tcpModel)
+//                            startActivity(intent)
+
+
+                            //webRTC
+                            var intent = Intent()
+                            intent.setClass(this, WebRTCVoipAudioRingingActivity::class.java)
+                            intent.putExtra("targetId", interactionVO.fromSipId)
+                            intent.putExtra("TcpModel", tcpModel)
+                            startActivity(intent)
+
+                        }
+                    }
+                } else if (tcpModel.getAction() === TcpAction.VoiceAction.HANDOFF) { //对方挂断,不论我方呼出或呼入
+                    //todo: 清掉呼出的TcpModel,通话中界面更新 --- 显示对方已挂断并停留3秒,结束至正常界面;更新左侧
+
+                } else if (tcpModel.getAction() === TcpAction.VoiceAction.SUCCESS) {
+                    //todo 更新呼出的TcpModel,data放置vo
+                }
+                TcpType.VIDEO -> {
+                }
+                TcpType.IM -> if (tcpModel.getAction() === TcpAction.IMAction.MSG) {
+                    //todo: 使用通话中界面,显示有语音留言,停留3秒,结束至正常界面
+
+                }
+                TcpType.EVENT -> if (tcpModel.getAction() === TcpAction.EventAction.KEY_CLICK) { //有新事件过来
+                    //todo: 服务端通过data给出具体的事件名称放置data。使用通话中界面,显示事件名称,停留3秒,结束至正常界面
+                    Log.e(TAG, "收到事件tcp")
+                }
+                TcpType.SOS -> if (tcpModel.getAction() === TcpAction.SOSAction.CALL) {
+                    Log.e(TAG, "" + tcpModel.getType() + " " + tcpModel.getAction())
+
+                    var intent = Intent()
+                    intent.setClass(this, SOSEmergencyCallActivity::class.java)
+                    intent.putExtra("TcpModel", tcpModel)
+                    startActivity(intent)
+                }
+                TcpType.DEVICE -> if (tcpModel.getAction() === TcpAction.DeviceAction.APP_UPDATE) {//更新APP
+                    checkAppVersion()
+                } else if (tcpModel.getAction() === TcpAction.DeviceAction.RESTART) { //刷新数据
+
+                }
+            }
+        }
+    }
+
+
+    //WiFi监听
+    inner class WifiReceiver : BroadcastReceiver() {
+        override fun onReceive(context: Context, intent: Intent) {
+            if (intent.action == WifiManager.RSSI_CHANGED_ACTION) {
+                if (wifiManager != null && netType == NetHelper.NETWORK_WIFI) {
+                    val wifiInfo = wifiManager.getConnectionInfo()
+                    val wifi = wifiInfo.getRssi();//获取wifi信号强度
+//                    Log.e(TAG,"wifi 信号强度"+wifi)
+
+                    if (wifi > -50 && wifi < 0) {//最强
+//                        Log.e(TAG, "wzlll 最强")
+                        wifi_rssi_tv.text = "较强"
+                    } else if (wifi > -70 && wifi < -50) {//较强
+//                        Log.e(TAG, "wzlll 较强")
+                        wifi_rssi_tv.text = "一般"
+                    } else if (wifi > -80 && wifi < -70) {//较弱
+//                        Log.e(TAG, "wzlll 较弱")
+                        wifi_rssi_tv.text = "微弱"
+                    } else if (wifi > -100 && wifi < -80) {//微弱
+//                        Log.e(TAG, "wzlll 微弱")
+                        wifi_rssi_tv.setTextColor(Color.parseColor("#FF3030"))
+                        wifi_rssi_tv.text = "wifi信号较弱,请注意"
+                    }
+                }
+            }
+        }
+    }
+}

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

@@ -36,6 +36,8 @@ 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.contract.home.WatchHomeActivityContract
 import com.wdkl.ncs.android.middleware.logic.presenter.home.WatchHomeActivityPresenter
 import com.wdkl.ncs.android.middleware.logic.presenter.home.WatchHomeActivityPresenter
 import com.wdkl.ncs.android.middleware.model.dos.AppVersionDO
 import com.wdkl.ncs.android.middleware.model.dos.AppVersionDO
+import com.wdkl.ncs.android.middleware.model.dos.DeviceDO
+import com.wdkl.ncs.android.middleware.model.dto.TcpSeverDTO
 
 
 import com.wdkl.ncs.android.middleware.tcp.TcpClient
 import com.wdkl.ncs.android.middleware.tcp.TcpClient
 
 
@@ -58,6 +60,7 @@ import kotlin.math.log
 class WatchHomeActivity : BaseActivity<WatchHomeActivityPresenter, WatchActivityHomeBinding>(), WatchHomeActivityContract.View, View.OnClickListener, View.OnLongClickListener,IUserState {
 class WatchHomeActivity : BaseActivity<WatchHomeActivityPresenter, WatchActivityHomeBinding>(), WatchHomeActivityContract.View, View.OnClickListener, View.OnLongClickListener,IUserState {
 
 
 
 
+
     var TAG = WatchHomeActivity::class.java.getSimpleName()
     var TAG = WatchHomeActivity::class.java.getSimpleName()
 
 
     //监听网络变化
     //监听网络变化
@@ -212,6 +215,11 @@ class WatchHomeActivity : BaseActivity<WatchHomeActivityPresenter, WatchActivity
             }
             }
         }
         }
     }
     }
+    override fun showData(data: DeviceDO) {
+    }
+
+    override fun setTcpServerHost(tcpSeverDTO: TcpSeverDTO) {
+    }
 
 
     fun checkAppVersion() {
     fun checkAppVersion() {
         Constants.APP_PATH = ""
         Constants.APP_PATH = ""
@@ -287,11 +295,14 @@ class WatchHomeActivity : BaseActivity<WatchHomeActivityPresenter, WatchActivity
 
 
     @Subscribe(threadMode = ThreadMode.MAIN)
     @Subscribe(threadMode = ThreadMode.MAIN)
     fun onMoonEvent(messageEvent: MessageEvent) {
     fun onMoonEvent(messageEvent: MessageEvent) {
+//        Log.e(TAG,""+messageEvent.tag)
+//        var tcpModels = messageEvent.getMessage() as TcpModel
+//        Log.e(TAG,""+tcpModels.getAction())
         if(messageEvent.tag == 14){
         if(messageEvent.tag == 14){
             //唤醒屏幕并解锁屏幕
             //唤醒屏幕并解锁屏幕
             Util().wakeUpAndUnlock(this)
             Util().wakeUpAndUnlock(this)
 
 
-        }else if(messageEvent.tag == 13){
+        }else if(messageEvent.tag == Constants.EVENT_TCP_APP_UPDATE){
             //更新APP
             //更新APP
             checkAppVersion()
             checkAppVersion()
         }else if(messageEvent.tag == Constants.EVENT_SIP_REGISTER_STATUS){
         }else if(messageEvent.tag == Constants.EVENT_SIP_REGISTER_STATUS){
@@ -402,7 +413,11 @@ class WatchHomeActivity : BaseActivity<WatchHomeActivityPresenter, WatchActivity
                     intent.putExtra("TcpModel", tcpModel)
                     intent.putExtra("TcpModel", tcpModel)
                     startActivity(intent)
                     startActivity(intent)
                 }
                 }
+                TcpType.DEVICE -> if (tcpModel.getAction() === TcpAction.DeviceAction.APP_UPDATE) {//更新APP
+                    checkAppVersion()
+                }else if(tcpModel.getAction() === TcpAction.DeviceAction.RESTART){ //刷新数据
 
 
+                }
             }
             }
         }
         }
     }
     }

+ 165 - 70
home/src/main/code/com/wdkl/ncs/android/component/home/activity/WebRTCVoipAudioActivity.kt

@@ -2,20 +2,25 @@ package com.wdkl.ncs.android.component.home.activity
 
 
 import android.app.Activity
 import android.app.Activity
 import android.os.Bundle
 import android.os.Bundle
+import android.os.CountDownTimer
 import android.os.Handler
 import android.os.Handler
 import android.os.SystemClock
 import android.os.SystemClock
 import android.support.v7.app.AlertDialog
 import android.support.v7.app.AlertDialog
 import android.util.Log
 import android.util.Log
+import android.view.KeyEvent
 import android.view.View
 import android.view.View
 import android.view.WindowManager
 import android.view.WindowManager
+import android.widget.Toast
 import com.google.gson.Gson
 import com.google.gson.Gson
 import com.wdkl.core.voip.VoipEvent
 import com.wdkl.core.voip.VoipEvent
 import com.wdkl.ncs.android.component.home.R
 import com.wdkl.ncs.android.component.home.R
 import com.wdkl.ncs.android.component.home.util.MediaPlayHelper
 import com.wdkl.ncs.android.component.home.util.MediaPlayHelper
 import com.wdkl.ncs.android.component.nursehome.common.Constants
 import com.wdkl.ncs.android.component.nursehome.common.Constants
+import com.wdkl.ncs.android.lib.utils.AppTool
 import com.wdkl.ncs.android.lib.utils.showMessage
 import com.wdkl.ncs.android.lib.utils.showMessage
 import com.wdkl.ncs.android.middleware.model.vo.InteractionVO
 import com.wdkl.ncs.android.middleware.model.vo.InteractionVO
 import com.wdkl.ncs.android.middleware.tcp.TcpClient
 import com.wdkl.ncs.android.middleware.tcp.TcpClient
+import com.wdkl.ncs.android.middleware.tcp.TcpClientHandler
 import com.wdkl.ncs.android.middleware.tcp.channel.DeviceChannel
 import com.wdkl.ncs.android.middleware.tcp.channel.DeviceChannel
 import com.wdkl.ncs.android.middleware.tcp.channel.VoiceUtil
 import com.wdkl.ncs.android.middleware.tcp.channel.VoiceUtil
 import com.wdkl.ncs.android.middleware.tcp.dto.TcpModel
 import com.wdkl.ncs.android.middleware.tcp.dto.TcpModel
@@ -31,12 +36,13 @@ import kotlinx.android.synthetic.main.activity_sip_voip_audio.call_duration_tv
 import kotlinx.android.synthetic.main.activity_sip_voip_audio.hang_up_imagev
 import kotlinx.android.synthetic.main.activity_sip_voip_audio.hang_up_imagev
 import kotlinx.android.synthetic.main.activity_sip_voip_audio.room_number_tv
 import kotlinx.android.synthetic.main.activity_sip_voip_audio.room_number_tv
 import kotlinx.android.synthetic.main.activity_sip_voip_audio_ringing.*
 import kotlinx.android.synthetic.main.activity_sip_voip_audio_ringing.*
+import kotlinx.android.synthetic.main.activity_web_rtc_voip_audio.*
 import org.greenrobot.eventbus.EventBus
 import org.greenrobot.eventbus.EventBus
 import org.greenrobot.eventbus.Subscribe
 import org.greenrobot.eventbus.Subscribe
 import org.greenrobot.eventbus.ThreadMode
 import org.greenrobot.eventbus.ThreadMode
 import java.util.*
 import java.util.*
 
 
-class WebRTCVoipAudioActivity: Activity(), View.OnClickListener {
+class WebRTCVoipAudioActivity : Activity(), View.OnClickListener {
     var TAG = WebRTCVoipAudioActivity::class.java.simpleName
     var TAG = WebRTCVoipAudioActivity::class.java.simpleName
 
 
 
 
@@ -49,7 +55,12 @@ class WebRTCVoipAudioActivity: Activity(), View.OnClickListener {
     var tcpModel = TcpModel()
     var tcpModel = TcpModel()
 
 
     private var gEngineKit: SkyEngineKit? = null
     private var gEngineKit: SkyEngineKit? = null
+    private var handsFree:Boolean = false  //免提状态
 
 
+    private var CALL_TIMEOUT = 2 //多久可以再次点击
+    //呼叫倒计时
+    lateinit var countDownTimer: CountDownTimer
+    private var isClick = false //是否可点击
 
 
 
 
     override fun onCreate(savedInstanceState: Bundle?) {
     override fun onCreate(savedInstanceState: Bundle?) {
@@ -57,10 +68,11 @@ class WebRTCVoipAudioActivity: Activity(), View.OnClickListener {
 //        window.setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
 //        window.setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,
 //                WindowManager.LayoutParams.FLAG_FULLSCREEN)
 //                WindowManager.LayoutParams.FLAG_FULLSCREEN)
         setContentView(R.layout.activity_web_rtc_voip_audio)
         setContentView(R.layout.activity_web_rtc_voip_audio)
-
-        if(!EventBus.getDefault().isRegistered(this)) {
+        if (!EventBus.getDefault().isRegistered(this)) {
             EventBus.getDefault().register(this)
             EventBus.getDefault().register(this)
         }
         }
+        initCountDownTimer()
+        countDownTimer.start()
 
 
         //todo 设置为通话状态 有其他用户输入时 DeviceChannel设置返回通话中
         //todo 设置为通话状态 有其他用户输入时 DeviceChannel设置返回通话中
         DeviceChannel.calling = true
         DeviceChannel.calling = true
@@ -116,14 +128,14 @@ class WebRTCVoipAudioActivity: Activity(), View.OnClickListener {
 //        }
 //        }
 
 
 
 
-
-
         targetId = intent.getStringExtra("targetId")
         targetId = intent.getStringExtra("targetId")
         Log.e(TAG, "SIP账号$targetId")
         Log.e(TAG, "SIP账号$targetId")
         tcpModel = intent.getSerializableExtra("TcpModel") as TcpModel
         tcpModel = intent.getSerializableExtra("TcpModel") as TcpModel
 //        interactionVO = (InteractionVO) getIntent().getSerializableExtra("interactionVO");
 //        interactionVO = (InteractionVO) getIntent().getSerializableExtra("interactionVO");
         action = intent.getStringExtra(ACTION)
         action = intent.getStringExtra(ACTION)
-           //测试
+
+        Log.e(TAG, "tcpModel" + tcpModel.action)
+        //测试
 //        SipHelperUtil.getInstance(this).getmSipCallBack().startCall(targetId)
 //        SipHelperUtil.getInstance(this).getmSipCallBack().startCall(targetId)
 //        SipHelperUtil.getInstance(this).getmSipCallBack().startCall("3288")
 //        SipHelperUtil.getInstance(this).getmSipCallBack().startCall("3288")
 
 
@@ -131,24 +143,34 @@ class WebRTCVoipAudioActivity: Activity(), View.OnClickListener {
         if (tcpModel.type == TcpType.VOICE) {
         if (tcpModel.type == TcpType.VOICE) {
             if (tcpModel.action === TcpAction.VoiceAction.CALL) {
             if (tcpModel.action === TcpAction.VoiceAction.CALL) {
                 val interactionVO = Gson().fromJson(tcpModel.data.toString(), InteractionVO::class.java)
                 val interactionVO = Gson().fromJson(tcpModel.data.toString(), InteractionVO::class.java)
-                room_number_tv.text =  interactionVO.fromFrameFullName
+                room_number_tv.text = interactionVO.fromFrameFullName
                 bao_mother_name_tv.setText(interactionVO.fromMemberName)
                 bao_mother_name_tv.setText(interactionVO.fromMemberName)
             } else if (tcpModel.action === TcpAction.VoiceAction.SUCCESS) {
             } else if (tcpModel.action === TcpAction.VoiceAction.SUCCESS) {
                 val interactionVO = Gson().fromJson(tcpModel.data.toString(), InteractionVO::class.java)
                 val interactionVO = Gson().fromJson(tcpModel.data.toString(), InteractionVO::class.java)
-                room_number_tv.text =  interactionVO.toFrameFullName
+                room_number_tv.text = interactionVO.toFrameFullName
                 bao_mother_name_tv.setText(interactionVO.toMemberName)
                 bao_mother_name_tv.setText(interactionVO.toMemberName)
             }
             }
+//            else if(tcpModel.action === TcpAction.VoiceAction.CALLING){
+//                showMessage("对方正在通话")
+//                val interactionVO = Gson().fromJson(tcpModel.data.toString(), InteractionVO::class.java)
+//                room_number_tv.text =  interactionVO.toFrameFullName
+//                bao_mother_name_tv.setText(interactionVO.toMemberName)
+//                MediaPlayHelper.getInstance().stopMusic()
+//                Log.e(TAG, "对方正在通话")
+//                finish()
+//
+//            }
         }
         }
 
 
         if (action == CALLING) {
         if (action == CALLING) {
-            Log.e(TAG,"自己同意 拨打过去。。。")
+            Log.e(TAG, "自己同意 拨打过去。。。")
             //主动拨打电话
             //主动拨打电话
 //            SipHelperUtil.getInstance(this).getmSipCallBack().startCall(targetId)
 //            SipHelperUtil.getInstance(this).getmSipCallBack().startCall(targetId)
 
 
 
 
             //webRTC
             //webRTC
             var room = UUID.randomUUID().toString() + System.currentTimeMillis()
             var room = UUID.randomUUID().toString() + System.currentTimeMillis()
-             Log.e(TAG,"生成的房间号room "+room  +"sipid targetId" +targetId)
+            Log.e(TAG, "生成的房间号room " + room + "sipid targetId" + targetId)
             val b = gEngineKit?.startOutCall(applicationContext, room, targetId, true)
             val b = gEngineKit?.startOutCall(applicationContext, room, targetId, true)
             if (b!!) {
             if (b!!) {
 //                finish()
 //                finish()
@@ -160,7 +182,7 @@ class WebRTCVoipAudioActivity: Activity(), View.OnClickListener {
                 Handler().postDelayed({
                 Handler().postDelayed({
                     //防止建立连接的时候 不能成功切换外音
                     //防止建立连接的时候 不能成功切换外音
                     session.toggleSpeaker(true)
                     session.toggleSpeaker(true)
-                },3000)
+                }, 3500)
             }
             }
 
 
             call_duration_tv.visibility = View.VISIBLE
             call_duration_tv.visibility = View.VISIBLE
@@ -169,10 +191,10 @@ class WebRTCVoipAudioActivity: Activity(), View.OnClickListener {
             Handler().postDelayed({
             Handler().postDelayed({
                 call_duration_tv.base = SystemClock.elapsedRealtime()
                 call_duration_tv.base = SystemClock.elapsedRealtime()
                 call_duration_tv.start()
                 call_duration_tv.start()
-            },2900)
+            }, 2900)
 
 
         } else if (action == RING) {
         } else if (action == RING) {
-            Log.e(TAG,"接电话。。。")
+            Log.e(TAG, "接电话。。。")
             //接听电话
             //接听电话
 //            SipHelperUtil.getInstance(this).getmSipCallBack().autoTalking()
 //            SipHelperUtil.getInstance(this).getmSipCallBack().autoTalking()
         }
         }
@@ -188,63 +210,99 @@ class WebRTCVoipAudioActivity: Activity(), View.OnClickListener {
     }
     }
 
 
 
 
-
-    fun init(){
+    fun init() {
         hang_up_imagev.setOnClickListener(this)
         hang_up_imagev.setOnClickListener(this)
-
-
+        hands_free_image.setOnClickListener(this)
 
 
     }
     }
+
     override fun onClick(p0: View?) {
     override fun onClick(p0: View?) {
-        when(p0?.id){
-          R.id.hang_up_imagev ->{
-              var interactionVO: InteractionVO? = null
-              if (tcpModel.data.javaClass.name == String::class.java.name) {
-                  interactionVO = Gson().fromJson(tcpModel.data.toString(), InteractionVO::class.java)
-              } else {
-                  interactionVO = tcpModel.data as InteractionVO
-              }
-              Log.e(TAG, "tcpModel" + interactionVO!!.id!!)
-              Log.e(TAG, "tcpModel" + tcpModel.toJson())
-              //todo 给服务器发送挂断 tcp
-              if (interactionVO != null) {
-                  if (tcpModel.type == TcpType.VOICE) {
-                      if (tcpModel.action === TcpAction.VoiceAction.SUCCESS) {
-                          val voiceUtilTcpModel = VoiceUtil.voiceHandoff(Integer.parseInt(Constants.ids), tcpModel.toId, interactionVO.id)
-                          TcpClient.getInstance().sendMsg(voiceUtilTcpModel.toJson())
-                      } else if (tcpModel.action === TcpAction.VoiceAction.CALL) {
-                          val voiceUtilTcpModel = VoiceUtil.voiceHandoff(Integer.parseInt(Constants.ids), tcpModel.fromId, interactionVO.id)
-                          TcpClient.getInstance().sendMsg(voiceUtilTcpModel.toJson())
-                      }
+        when (p0?.id) {
+            R.id.hang_up_imagev -> {
+                if(!isClick)return
+
+                var interactionVO: InteractionVO? = null
+                if (tcpModel.data.javaClass.name == String::class.java.name) {
+                    interactionVO = Gson().fromJson(tcpModel.data.toString(), InteractionVO::class.java)
+                } else {
+                    interactionVO = tcpModel.data as InteractionVO
+                }
+                Log.e(TAG, "tcpModel" + interactionVO!!.id!!)
+                Log.e(TAG, "tcpModel" + tcpModel.toJson())
+
+                if(!TcpClientHandler.connecteds){
+                    EventBus.getDefault().post(MessageEvent(tcpModel, Constants.EVENT_TCP_BREAK))
+                }
+
+                //todo 给服务器发送挂断 tcp
+                if (interactionVO != null) {
+                    if (tcpModel.type == TcpType.VOICE) {
+                        if (tcpModel.action === TcpAction.VoiceAction.SUCCESS) {
+                            val voiceUtilTcpModel = VoiceUtil.voiceHandoff(Integer.parseInt(Constants.ids), tcpModel.toId, interactionVO.id)
+                            TcpClient.getInstance().sendMsg(voiceUtilTcpModel.toJson())
+                        } else if (tcpModel.action === TcpAction.VoiceAction.CALL) {
+                            val voiceUtilTcpModel = VoiceUtil.voiceHandoff(Integer.parseInt(Constants.ids), tcpModel.fromId, interactionVO.id)
+                            TcpClient.getInstance().sendMsg(voiceUtilTcpModel.toJson())
+                        }
 //                      SipHelperUtil.getInstance(this).getmSipCallBack().endCall()
 //                      SipHelperUtil.getInstance(this).getmSipCallBack().endCall()
 
 
-                      //webrtc
-                      val session = gEngineKit?.getCurrentSession()
-                      if (session != null) {
-                          SkyEngineKit.Instance().endCall()
-                      }
+                        //webrtc
+                        val session = gEngineKit?.getCurrentSession()
+                        if (session != null) {
+                            SkyEngineKit.Instance().endCall()
+                        }
 
 
-                      finish()
+                        finish()
 
 
-                  }
+                    }
 
 
-              }
+                }
+
+            }
+            R.id.hands_free_image -> {
+                Log.e(TAG,"handsFree "+handsFree)
+                if (!handsFree) {
+                    Log.e(TAG,"handsFree222 "+handsFree)
+                    hands_free_image.setImageResource(R.drawable.av_handfree_hover)
+                    val session = gEngineKit?.getCurrentSession()
+                    if (session != null) {
+                        session?.toggleSpeaker(true)
+                    }
+                    handsFree = true
+                } else {
+                    Log.e(TAG,"handsFree333 "+handsFree)
+                    hands_free_image.setImageResource(R.drawable.av_handfree)
+                    val session = gEngineKit?.getCurrentSession()
+                    if (session != null) {
+                        session?.toggleSpeaker(false)
+                    }
+                    handsFree = false
+                }
 
 
-          }
+            }
 
 
 
 
         }
         }
 
 
     }
     }
+    fun initCountDownTimer() {
+        countDownTimer = object : CountDownTimer(CALL_TIMEOUT * 1000L, 1000) {
+            override fun onTick(millisUntilFinished: Long) {
 
 
+            }
 
 
+            override fun onFinish() {
+                isClick = true
+            }
+        }
+    }
 
 
     @Subscribe(threadMode = ThreadMode.MAIN)
     @Subscribe(threadMode = ThreadMode.MAIN)
-   fun onMoonEvent(messageEvent: MessageEvent) {
+    fun onMoonEvent(messageEvent: MessageEvent) {
         if (messageEvent.tag == 2) {
         if (messageEvent.tag == 2) {
 
 
             val tcpModel = messageEvent.getMessage() as TcpModel
             val tcpModel = messageEvent.getMessage() as TcpModel
-            Log.e(TAG,"收到数据 "+tcpModel.toJson())
+            Log.e(TAG, "收到数据 " + tcpModel.toJson())
             if (tcpModel.action === TcpAction.VoiceAction.ACCEPT) {
             if (tcpModel.action === TcpAction.VoiceAction.ACCEPT) {
                 MediaPlayHelper.getInstance().stopMusic()
                 MediaPlayHelper.getInstance().stopMusic()
                 Log.i(TAG, "对方接听电话啦")
                 Log.i(TAG, "对方接听电话啦")
@@ -259,11 +317,11 @@ class WebRTCVoipAudioActivity: Activity(), View.OnClickListener {
                     call_duration_tv.base = SystemClock.elapsedRealtime()
                     call_duration_tv.base = SystemClock.elapsedRealtime()
                     call_duration_tv.start()
                     call_duration_tv.start()
 
 
-                },2900)
+                }, 2900)
 //                SipHelperUtil.getInstance(this).getmSipCallBack().startCall(targetId)
 //                SipHelperUtil.getInstance(this).getmSipCallBack().startCall(targetId)
 
 
                 var room = UUID.randomUUID().toString() + System.currentTimeMillis()
                 var room = UUID.randomUUID().toString() + System.currentTimeMillis()
-                Log.e(TAG,"生成的房间号room "+room  +"sipid targetId" +targetId)
+                Log.e(TAG, "生成的房间号room " + room + "sipid targetId" + targetId)
 
 
                 val b = gEngineKit?.startOutCall(applicationContext, room, targetId, true)
                 val b = gEngineKit?.startOutCall(applicationContext, room, targetId, true)
                 if (b!!) {
                 if (b!!) {
@@ -275,14 +333,14 @@ class WebRTCVoipAudioActivity: Activity(), View.OnClickListener {
                 } else {
                 } else {
                     Handler().postDelayed({
                     Handler().postDelayed({
                         session.toggleSpeaker(true)
                         session.toggleSpeaker(true)
-                    },3000)
+                    }, 3500)
 
 
                 }
                 }
 
 
-            }else if (tcpModel.action  == TcpAction.VoiceAction.HANDOFF) { //对方挂断
+            } else if (tcpModel.action == TcpAction.VoiceAction.HANDOFF) { //对方挂断
                 call_duration_tv.stop()
                 call_duration_tv.stop()
                 finish()
                 finish()
-            }else if (tcpModel.action === TcpAction.VoiceAction.REJECT) {
+            } else if (tcpModel.action === TcpAction.VoiceAction.REJECT) {
                 //voiceStatus.setText("对方拒绝接听");
                 //voiceStatus.setText("对方拒绝接听");
                 showMessage("对方拒绝接听")
                 showMessage("对方拒绝接听")
                 MediaPlayHelper.getInstance().stopMusic()
                 MediaPlayHelper.getInstance().stopMusic()
@@ -290,8 +348,11 @@ class WebRTCVoipAudioActivity: Activity(), View.OnClickListener {
             } else if (tcpModel.action === TcpAction.VoiceAction.CALLING) {
             } else if (tcpModel.action === TcpAction.VoiceAction.CALLING) {
                 //voiceStatus.setText("对方正在通话");
                 //voiceStatus.setText("对方正在通话");
                 showMessage("对方正在通话")
                 showMessage("对方正在通话")
-                MediaPlayHelper.getInstance().stopMusic()
-                finish()
+                AppTool.Time.delay(3000) {
+                    MediaPlayHelper.getInstance().stopMusic()
+                    finish()
+                }
+
             } else if (tcpModel.action === TcpAction.VoiceAction.FAILED) {
             } else if (tcpModel.action === TcpAction.VoiceAction.FAILED) {
                 //voiceStatus.setText("对方拒绝");
                 //voiceStatus.setText("对方拒绝");
                 showMessage("呼叫失败,对方可能不在线")
                 showMessage("呼叫失败,对方可能不在线")
@@ -302,31 +363,65 @@ class WebRTCVoipAudioActivity: Activity(), View.OnClickListener {
     }
     }
 
 
 
 
-    override fun onBackPressed(){
-        AlertDialog.Builder(this).setCancelable(true)
-                .setTitle("是否挂断?")
-                .setNegativeButton("取消") { arg0, arg1 -> }.setPositiveButton("确定"
-                ) { arg0, arg1 ->
-                    //                    timer.stop()
-//                    voipManager.hangup(object : IXHResultCallback {
-//                        override fun success(data: Any) {
-////                            stopAndFinish()
-//                        }
+//    override fun onBackPressed() {
+//        AlertDialog.Builder(this).setCancelable(true)
+//                .setTitle("是否挂断?")
+//                .setNegativeButton("取消") { arg0, arg1
+//                    -> }.setPositiveButton("确定"
+//                ) { arg0, arg1 ->
+//                    var interactionVO: InteractionVO? = null
+//                    if (tcpModel.data.javaClass.name == String::class.java.name) {
+//                        interactionVO = Gson().fromJson(tcpModel.data.toString(), InteractionVO::class.java)
+//                    } else {
+//                        interactionVO = tcpModel.data as InteractionVO
+//                    }
+//                    Log.e(TAG, "tcpModel" + interactionVO!!.id!!)
+//                    Log.e(TAG, "tcpModel" + tcpModel.toJson())
+//                    //todo 给服务器发送挂断 tcp
+//                    if (interactionVO != null) {
+//                        if (tcpModel.type == TcpType.VOICE) {
+//                            if (tcpModel.action === TcpAction.VoiceAction.SUCCESS) {
+//                                val voiceUtilTcpModel = VoiceUtil.voiceHandoff(Integer.parseInt(Constants.ids), tcpModel.toId, interactionVO.id)
+//                                TcpClient.getInstance().sendMsg(voiceUtilTcpModel.toJson())
+//                            } else if (tcpModel.action === TcpAction.VoiceAction.CALL) {
+//                                val voiceUtilTcpModel = VoiceUtil.voiceHandoff(Integer.parseInt(Constants.ids), tcpModel.fromId, interactionVO.id)
+//                                TcpClient.getInstance().sendMsg(voiceUtilTcpModel.toJson())
+//                            }
+////                      SipHelperUtil.getInstance(this).getmSipCallBack().endCall()
+//
+//                            //webrtc
+//                            val session = gEngineKit?.getCurrentSession()
+//                            if (session != null) {
+//                                SkyEngineKit.Instance().endCall()
+//                            }
+//
+//                            finish()
 //
 //
-//                        override fun failed(errMsg: String) {
-////                            MLOC.d("", "AEVENT_VOIP_ON_STOP errMsg:$errMsg")
-////                            MLOC.showMsg(this@SipVoipAudioActivity, errMsg)
 //                        }
 //                        }
-//                    })
-                }.show()
+//
+//                    }
+//
+//                }.show()
+//    }
+
+    override fun onKeyDown(keyCode: Int, event: KeyEvent): Boolean {
+        if (keyCode == KeyEvent.KEYCODE_BACK) {
+//            Toast.makeText(this, "按下了back键   onKeyDown()", Toast.LENGTH_SHORT).show()
+            return false
+        }
+        return super.onKeyDown(keyCode, event)
     }
     }
 
 
     override fun onDestroy() {
     override fun onDestroy() {
         super.onDestroy()
         super.onDestroy()
         //todo 状态设置为未在通话中
         //todo 状态设置为未在通话中
         DeviceChannel.calling = false
         DeviceChannel.calling = false
+        if(countDownTimer != null){
+            countDownTimer.cancel()
+        }
         MediaPlayHelper.getInstance().stopMusic()
         MediaPlayHelper.getInstance().stopMusic()
         EventBus.getDefault().unregister(this)
         EventBus.getDefault().unregister(this)
+
     }
     }
 
 
 }
 }

+ 21 - 3
home/src/main/code/com/wdkl/ncs/android/component/home/activity/WebRTCVoipAudioRingingActivity.kt

@@ -5,7 +5,9 @@ import android.content.Intent
 import android.graphics.Color
 import android.graphics.Color
 import android.os.Bundle
 import android.os.Bundle
 import android.os.CountDownTimer
 import android.os.CountDownTimer
+import android.support.v7.app.AlertDialog
 import android.util.Log
 import android.util.Log
+import android.view.KeyEvent
 import android.view.View
 import android.view.View
 import android.view.WindowManager
 import android.view.WindowManager
 import com.google.gson.Gson
 import com.google.gson.Gson
@@ -154,10 +156,28 @@ class WebRTCVoipAudioRingingActivity : Activity(), View.OnClickListener {
     }
     }
 
 
 
 
+    override fun onBackPressed() {
+
+
+    }
+
+    override fun onKeyUp(keyCode: Int, event: KeyEvent): Boolean {
+        return if (keyCode == KeyEvent.KEYCODE_BACK && event.action == KeyEvent.ACTION_UP) {
+
+            //不执行父类点击事件
+            true
+        } else super.onKeyUp(keyCode, event)
+        //继续执行父类其他点击事件
+    }
+
+
     @Subscribe(threadMode = ThreadMode.MAIN)
     @Subscribe(threadMode = ThreadMode.MAIN)
     fun onMoonEvent(messageEvent: MessageEvent) {
     fun onMoonEvent(messageEvent: MessageEvent) {
+        Log.e(TAG,"收到tcp"+tcpModel!!.action)
+
         if (messageEvent.tag == 2) {
         if (messageEvent.tag == 2) {
             val tcpModel = messageEvent.getMessage() as TcpModel?
             val tcpModel = messageEvent.getMessage() as TcpModel?
+            Log.e(TAG,"收到tcp"+tcpModel!!.action)
             if (tcpModel!!.action === TcpAction.VoiceAction.CANCEL || tcpModel!!.action === TcpAction.VoiceAction.HANDOFF) {
             if (tcpModel!!.action === TcpAction.VoiceAction.CANCEL || tcpModel!!.action === TcpAction.VoiceAction.HANDOFF) {
                 //对方取消;
                 //对方取消;
                 countDownTimer?.cancel()
                 countDownTimer?.cancel()
@@ -167,11 +187,9 @@ class WebRTCVoipAudioRingingActivity : Activity(), View.OnClickListener {
         }
         }
     }
     }
 
 
-
-
-
     override fun onDestroy() {
     override fun onDestroy() {
         super.onDestroy()
         super.onDestroy()
+        DeviceChannel.calling = false
         isAnswerOrHangUp = false
         isAnswerOrHangUp = false
         if (countDownTimer != null) {
         if (countDownTimer != null) {
             countDownTimer?.cancel()
             countDownTimer?.cancel()

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

@@ -22,16 +22,18 @@ interface HomeComponent {
     fun inject(activity: CategoryFragment)
     fun inject(activity: CategoryFragment)
 
 
     //手表
     //手表
+    fun inject(activity: WatchRegisterActivity)
+
     fun inject(activity: WatchHomeActivity)
     fun inject(activity: WatchHomeActivity)
 
 
+    fun inject(activity: WatchHome2Activity)
+
     fun inject(activity: AppUpdateActivity)
     fun inject(activity: AppUpdateActivity)
 
 
     fun inject(activity: WatchContactsActivity)
     fun inject(activity: WatchContactsActivity)
 
 
     fun inject(activity: WatchCallRecordsActivity)
     fun inject(activity: WatchCallRecordsActivity)
 
 
-    fun inject(activity: WatchRegisterActivity)
-
     fun inject(activity: EventActivity)
     fun inject(activity: EventActivity)
 
 
     fun inject(activity: WatchEventDetailActivity)
     fun inject(activity: WatchEventDetailActivity)

+ 46 - 11
home/src/main/code/com/wdkl/ncs/android/component/home/helper/AppUpdateHelper.java

@@ -8,6 +8,7 @@ import android.content.pm.PackageManager;
 import android.net.Uri;
 import android.net.Uri;
 import android.os.Build;
 import android.os.Build;
 import android.os.Environment;
 import android.os.Environment;
+import android.support.v4.content.FileProvider;
 import android.util.Log;
 import android.util.Log;
 
 
 import java.io.BufferedReader;
 import java.io.BufferedReader;
@@ -29,7 +30,10 @@ public class AppUpdateHelper {
      */
      */
     public static final String FILE_APK_NAME = "CallingBed2APK.apk";
     public static final String FILE_APK_NAME = "CallingBed2APK.apk";
 
 
+    public static Context mContext;
+
     public static void updateApp(Context context, UpdateCallBack callBack) {
     public static void updateApp(Context context, UpdateCallBack callBack) {
+        mContext = context;
         if (checkApkExit(context)) {
         if (checkApkExit(context)) {
             Log.d(TAG, "文件存在");
             Log.d(TAG, "文件存在");
         } else {
         } else {
@@ -49,17 +53,17 @@ public class AppUpdateHelper {
 
 
 
 
         //if (installApp(context.getPackageName(), path)) {
         //if (installApp(context.getPackageName(), path)) {
-        if (rootSilenceInstall(path)) {
-            Log.d(TAG, "安装成功");
-            if (callBack != null) {
-                callBack.onSuccess();
-            }
-        } else {
-            Log.d(TAG, "安装失败");
-            if (callBack != null) {
-                callBack.onFailed();
-            }
-        }
+//        if (rootSilenceInstall(path)) {
+//            Log.d(TAG, "安装成功");
+//            if (callBack != null) {
+//                callBack.onSuccess();
+//            }
+//        } else {
+//            Log.d(TAG, "安装失败");
+//            if (callBack != null) {
+//                callBack.onFailed();
+//            }
+//        }
 
 
 //        if (silentInstall(context, path)) {
 //        if (silentInstall(context, path)) {
 //            Log.d(TAG, "app 安装成功");
 //            Log.d(TAG, "app 安装成功");
@@ -67,8 +71,38 @@ public class AppUpdateHelper {
 //                callBack.onSuccess();
 //                callBack.onSuccess();
 //            }
 //            }
 //        }
 //        }
+
+        if (installAPP(path)) {
+            Log.d(TAG, "安装成功");
+            if (callBack != null) {
+                callBack.onSuccess();
+            }
+        }
     }
     }
 
 
+
+    public static boolean installAPP(String path) {
+
+        Intent intent = new Intent(Intent.ACTION_VIEW);
+        File apkFile = new File(path);
+        // 由于没有在Activity环境下启动Activity,设置下面的标签
+        intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
+        //Android 7.0以上要使用FileProvider
+        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
+            intent.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
+            //参数1 上下文, 参数2 Provider主机地址 和配置文件中保持一致   参数3  共享的文件
+            Uri uri = FileProvider.getUriForFile(mContext, mContext.getPackageName() + ".fileprovider", apkFile);
+            //添加这一句表示对目标应用临时授权该Uri所代表的文件
+//                    intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
+            intent.setDataAndType(uri, "application/vnd.android.package-archive");
+        } else {
+            intent.setDataAndType(Uri.fromFile(apkFile), "application/vnd.android.package-archive");
+        }
+        mContext.startActivity(intent);
+        return true;
+    }
+
+
     private static boolean checkApkExit(Context context) {
     private static boolean checkApkExit(Context context) {
         File file = new File(FILE_APK_PATH + "/" + FILE_APK_NAME);
         File file = new File(FILE_APK_PATH + "/" + FILE_APK_NAME);
         return file.exists();
         return file.exists();
@@ -189,6 +223,7 @@ public class AppUpdateHelper {
 
 
     public interface UpdateCallBack {
     public interface UpdateCallBack {
         void onFailed();
         void onFailed();
+
         void onSuccess();
         void onSuccess();
     }
     }
 }
 }

+ 193 - 4
home/src/main/code/com/wdkl/ncs/android/component/home/service/APPService.kt

@@ -4,13 +4,23 @@ import android.app.Notification
 import android.app.Service
 import android.app.Service
 import android.content.Intent
 import android.content.Intent
 import android.os.Binder
 import android.os.Binder
+import android.os.CountDownTimer
 import android.os.IBinder
 import android.os.IBinder
 import android.text.TextUtils
 import android.text.TextUtils
+import android.util.Log
+import com.google.gson.Gson
 import com.wdkl.core.consts.Urls
 import com.wdkl.core.consts.Urls
 import com.wdkl.core.socket.SocketManager
 import com.wdkl.core.socket.SocketManager
 import com.wdkl.ncs.android.component.nursehome.common.Constants
 import com.wdkl.ncs.android.component.nursehome.common.Constants
+import com.wdkl.ncs.android.middleware.model.vo.InteractionVO
+import com.wdkl.ncs.android.middleware.tcp.TcpClient
 import com.wdkl.ncs.android.middleware.tcp.TcpClientHandler
 import com.wdkl.ncs.android.middleware.tcp.TcpClientHandler
+import com.wdkl.ncs.android.middleware.tcp.channel.VoiceUtil
+import com.wdkl.ncs.android.middleware.tcp.dto.TcpModel
+import com.wdkl.ncs.android.middleware.tcp.enums.TcpAction
+import com.wdkl.ncs.android.middleware.tcp.enums.TcpType
 import com.wdkl.ncs.android.middleware.utils.MessageEvent
 import com.wdkl.ncs.android.middleware.utils.MessageEvent
+import com.wdkl.skywebrtc.SkyEngineKit
 import org.greenrobot.eventbus.EventBus
 import org.greenrobot.eventbus.EventBus
 import org.greenrobot.eventbus.Subscribe
 import org.greenrobot.eventbus.Subscribe
 import org.greenrobot.eventbus.ThreadMode
 import org.greenrobot.eventbus.ThreadMode
@@ -20,11 +30,23 @@ class APPService : Service() {
     private val TAG = APPService::class.java.simpleName
     private val TAG = APPService::class.java.simpleName
     internal var myBinder = ServiceBinder()
     internal var myBinder = ServiceBinder()
 
 
+    private var CALL_TIMEOUT = 12 //多久可以再次点击
+    //呼叫倒计时
+    lateinit var countDownTimer: CountDownTimer
+
+    companion object {
+        var tcpModel: TcpModel? = null
+    }
+
+    var isThread: Boolean = true
+
     override fun onCreate() {
     override fun onCreate() {
         super.onCreate()
         super.onCreate()
         EventBus.getDefault().register(this)
         EventBus.getDefault().register(this)
 //        checkStatus()
 //        checkStatus()
         connectWebsocket()
         connectWebsocket()
+        connectWebsocket2()
+        initCountDownTimer()
     }
     }
 
 
     override fun onStartCommand(intent: Intent, flags: Int, startId: Int): Int {
     override fun onStartCommand(intent: Intent, flags: Int, startId: Int): Int {
@@ -64,9 +86,9 @@ class APPService : Service() {
         timerTask2 = object : TimerTask() {
         timerTask2 = object : TimerTask() {
             override fun run() {
             override fun run() {
 //                WebsocketUtil.connectWS()//定时检测Websocket;如有断开;及时联接
 //                WebsocketUtil.connectWS()//定时检测Websocket;如有断开;及时联接
-                if(!TcpClientHandler.connecteds){
+                if (!TcpClientHandler.connecteds) {
                     EventBus.getDefault().post(MessageEvent("", 14))
                     EventBus.getDefault().post(MessageEvent("", 14))
-                    if(!TextUtils.isEmpty(Constants.sip_id)){
+                    if (!TextUtils.isEmpty(Constants.sip_id)) {
                         // 连接socket:登录
                         // 连接socket:登录
                         SocketManager.getInstance().connect(Urls.WS, Constants.sip_id, 0)
                         SocketManager.getInstance().connect(Urls.WS, Constants.sip_id, 0)
                     }
                     }
@@ -78,19 +100,186 @@ class APPService : Service() {
 
 
     }
     }
 
 
+
+    var timer3: Timer? = null
+    var timerTask3: TimerTask? = null
+
+    private fun connectWebsocket2() {
+        if (timer3 != null) timer3!!.purge()
+        if (timerTask3 != null) timerTask3!!.cancel()
+        timer3 = Timer()
+        timerTask3 = object : TimerTask() {
+            override fun run() {
+//                WebsocketUtil.connectWS()//定时检测Websocket;如有断开;及时联接
+                    if (TcpClientHandler.connecteds && tcpModel != null) {
+
+                        var interactionVO: InteractionVO? = null
+                        if (tcpModel!!.data.javaClass.name == String::class.java.name) {
+                            interactionVO = Gson().fromJson(tcpModel?.data.toString(), InteractionVO::class.java)
+                        } else {
+                            interactionVO = tcpModel?.data as InteractionVO
+                        }
+//                Log.e(TAG, "tcpModel" + interactionVO!!.id!!)
+//                Log.e(TAG, "tcpModel" + tcpModel?.toJson())
+
+
+                        //todo 给服务器发送挂断 tcp
+                        if (interactionVO != null) {
+                            if (tcpModel?.type == TcpType.VOICE) {
+                                if (tcpModel?.action === TcpAction.VoiceAction.SUCCESS) {
+                                    val voiceUtilTcpModel = VoiceUtil.voiceHandoff(Integer.parseInt(Constants.ids), tcpModel?.toId, interactionVO.id)
+                                    TcpClient.getInstance().sendMsg(voiceUtilTcpModel.toJson())
+                                } else if (tcpModel?.action === TcpAction.VoiceAction.CALL) {
+                                    val voiceUtilTcpModel = VoiceUtil.voiceHandoff(Integer.parseInt(Constants.ids), tcpModel?.fromId, interactionVO.id)
+                                    TcpClient.getInstance().sendMsg(voiceUtilTcpModel.toJson())
+                                }
+                            }
+
+                        }
+                        tcpModel = null
+                }
+            }
+        }
+        timer3!!.schedule(timerTask3, 2000, 1000)
+
+    }
+
+
+
     override fun onDestroy() {
     override fun onDestroy() {
         super.onDestroy()
         super.onDestroy()
+        if (countDownTimer != null) {
+            countDownTimer.cancel()
+        }
         stopForeground(true)// 停止前台服务--参数:表示是否移除之前的通知
         stopForeground(true)// 停止前台服务--参数:表示是否移除之前的通知
         EventBus.getDefault().unregister(this)
         EventBus.getDefault().unregister(this)
     }
     }
 
 
     inner class ServiceBinder : Binder() {
     inner class ServiceBinder : Binder() {
-        fun doThings() {}
+        fun doThings() {
+
+        }
     }
     }
 
 
+    fun initCountDownTimer() {
+        countDownTimer = object : CountDownTimer(CALL_TIMEOUT * 1000L, 1000) {
+            override fun onTick(millisUntilFinished: Long) {
+
+            }
+
+            override fun onFinish() {
+                var interactionVO: InteractionVO? = null
+                if (tcpModel!!.data.javaClass.name == String::class.java.name) {
+                    interactionVO = Gson().fromJson(tcpModel?.data.toString(), InteractionVO::class.java)
+                } else {
+                    interactionVO = tcpModel?.data as InteractionVO
+                }
+//                Log.e(TAG, "tcpModel" + interactionVO!!.id!!)
+//                Log.e(TAG, "tcpModel" + tcpModel?.toJson())
+
+
+                //todo 给服务器发送挂断 tcp
+                if (interactionVO != null) {
+                    if (tcpModel?.type == TcpType.VOICE) {
+                        if (tcpModel?.action === TcpAction.VoiceAction.SUCCESS) {
+                            val voiceUtilTcpModel = VoiceUtil.voiceHandoff(Integer.parseInt(Constants.ids), tcpModel?.toId, interactionVO.id)
+                            TcpClient.getInstance().sendMsg(voiceUtilTcpModel.toJson())
+                        } else if (tcpModel?.action === TcpAction.VoiceAction.CALL) {
+                            val voiceUtilTcpModel = VoiceUtil.voiceHandoff(Integer.parseInt(Constants.ids), tcpModel?.fromId, interactionVO.id)
+                            TcpClient.getInstance().sendMsg(voiceUtilTcpModel.toJson())
+                        }
+                    }
+
+                }
+                tcpModel = null
+            }
+        }
+    }
+
+//    companion object {
+//        fun hangUp() {
+//
+//        }
+//    }
+
+
     @Subscribe(threadMode = ThreadMode.MAIN)
     @Subscribe(threadMode = ThreadMode.MAIN)
     fun onMoonEvent(messageEvent: MessageEvent) {
     fun onMoonEvent(messageEvent: MessageEvent) {
 
 
-    }
 
 
+        Log.e(TAG, "messageEvent.tag" + messageEvent.tag)
+
+        if (messageEvent.tag == Constants.EVENT_TCP_BREAK) {
+            tcpModel = messageEvent.getMessage() as TcpModel
+//            countDownTimer.start()
+
+//            Thread(Runnable {
+//                while (isThread) {
+//                    if (TcpClientHandler.connecteds) {
+//
+//                        var interactionVO: InteractionVO? = null
+//                        if (tcpModel!!.data.javaClass.name == String::class.java.name) {
+//                            interactionVO = Gson().fromJson(tcpModel?.data.toString(), InteractionVO::class.java)
+//                        } else {
+//                            interactionVO = tcpModel?.data as InteractionVO
+//                        }
+////                Log.e(TAG, "tcpModel" + interactionVO!!.id!!)
+////                Log.e(TAG, "tcpModel" + tcpModel?.toJson())
+//
+//
+//                        //todo 给服务器发送挂断 tcp
+//                        if (interactionVO != null) {
+//                            if (tcpModel?.type == TcpType.VOICE) {
+//                                if (tcpModel?.action === TcpAction.VoiceAction.SUCCESS) {
+//                                    val voiceUtilTcpModel = VoiceUtil.voiceHandoff(Integer.parseInt(Constants.ids), tcpModel?.toId, interactionVO.id)
+//                                    TcpClient.getInstance().sendMsg(voiceUtilTcpModel.toJson())
+//                                } else if (tcpModel?.action === TcpAction.VoiceAction.CALL) {
+//                                    val voiceUtilTcpModel = VoiceUtil.voiceHandoff(Integer.parseInt(Constants.ids), tcpModel?.fromId, interactionVO.id)
+//                                    TcpClient.getInstance().sendMsg(voiceUtilTcpModel.toJson())
+//                                }
+//                            }
+//
+//                        }
+//                        tcpModel = null
+//                        isThread = false
+//                    }
+//                    try {
+//                        Thread.sleep(1000)
+//                    } catch (e: InterruptedException) {
+//                        e.printStackTrace()
+//                    }
+//                }
+//
+//            }).start()
+
+        } else if (messageEvent.tag == Constants.EVENT_TCP_RETRANSMISSION) {
+//            var interactionVO: InteractionVO? = null
+//            if (tcpModel!!.data.javaClass.name == String::class.java.name) {
+//                interactionVO = Gson().fromJson(tcpModel?.data.toString(), InteractionVO::class.java)
+//            } else {
+//                interactionVO = tcpModel?.data as InteractionVO
+//            }
+////                Log.e(TAG, "tcpModel" + interactionVO!!.id!!)
+////                Log.e(TAG, "tcpModel" + tcpModel?.toJson())
+//
+//
+//            //todo 给服务器发送挂断 tcp
+//            if (interactionVO != null) {
+//                if (tcpModel?.type == TcpType.VOICE) {
+//                    if (tcpModel?.action === TcpAction.VoiceAction.SUCCESS) {
+//                        val voiceUtilTcpModel = VoiceUtil.voiceHandoff(Integer.parseInt(Constants.ids), tcpModel?.toId, interactionVO.id)
+//                        TcpClient.getInstance().sendMsg(voiceUtilTcpModel.toJson())
+//                    } else if (tcpModel?.action === TcpAction.VoiceAction.CALL) {
+//                        val voiceUtilTcpModel = VoiceUtil.voiceHandoff(Integer.parseInt(Constants.ids), tcpModel?.fromId, interactionVO.id)
+//                        TcpClient.getInstance().sendMsg(voiceUtilTcpModel.toJson())
+//                    }
+//                }
+//
+//            }
+//            tcpModel = null
+//        }
+
+        }
+
+    }
 }
 }

+ 5 - 0
home/src/main/code/com/wdkl/ncs/android/component/home/service/TcpHandleService.kt

@@ -42,6 +42,11 @@ class TcpHandleService : Service(){
     @Subscribe(threadMode = ThreadMode.MAIN)
     @Subscribe(threadMode = ThreadMode.MAIN)
     fun onMoonEvent(messageEvent: MessageEvent) {
     fun onMoonEvent(messageEvent: MessageEvent) {
         Log.i("TcpHandleService", "MessageEvent : " + messageEvent.tag)
         Log.i("TcpHandleService", "MessageEvent : " + messageEvent.tag)
+        if (messageEvent.tag==2){
+            var tcpModel = messageEvent.getMessage() as TcpModel
+           Log.e("tag",tcpModel.toJson())
+        }
+
         if (messageEvent.tag==3){
         if (messageEvent.tag==3){
             var tcpModel = messageEvent.getMessage() as TcpModel
             var tcpModel = messageEvent.getMessage() as TcpModel
             Log.i("TcpHandleService", "TcpModel : " + tcpModel.fromId)
             Log.i("TcpHandleService", "TcpModel : " + tcpModel.fromId)

+ 1 - 1
home/src/main/code/com/wdkl/ncs/android/component/home/util/Util.kt

@@ -27,7 +27,7 @@ class Util {
         val pm = context.getSystemService(Context.POWER_SERVICE) as PowerManager
         val pm = context.getSystemService(Context.POWER_SERVICE) as PowerManager
         val screenOn = pm.isScreenOn
         val screenOn = pm.isScreenOn
 
 
-        if (!screenOn) {//如果是熄灭状态
+        if (!screenOn) { //如果是熄灭状态
             @SuppressLint("InvalidWakeLockTag")
             @SuppressLint("InvalidWakeLockTag")
             val wakeLock = pm.newWakeLock(PowerManager.ACQUIRE_CAUSES_WAKEUP or PowerManager.SCREEN_DIM_WAKE_LOCK, "TAG")
             val wakeLock = pm.newWakeLock(PowerManager.ACQUIRE_CAUSES_WAKEUP or PowerManager.SCREEN_DIM_WAKE_LOCK, "TAG")
             wakeLock.acquire()//亮屏
             wakeLock.acquire()//亮屏

+ 2 - 0
home/src/main/java/com/wdkl/ncs/android/component/home/SOSEmergencyCallActivity.kt

@@ -35,6 +35,8 @@ class SOSEmergencyCallActivity : Activity(), View.OnClickListener {
         interactionVO = Gson().fromJson(tcpModel!!.getData().toString(), InteractionVO::class.java)
         interactionVO = Gson().fromJson(tcpModel!!.getData().toString(), InteractionVO::class.java)
         init()
         init()
         MediaPlayHelper.getInstance().playResMusic(R.raw.sos2, 1.0f, true)
         MediaPlayHelper.getInstance().playResMusic(R.raw.sos2, 1.0f, true)
+
+
     }
     }
 
 
 
 

+ 1 - 2
home/src/main/res/drawable/shape_untreated_quantity.xml

@@ -1,6 +1,5 @@
 <?xml version="1.0" encoding="utf-8"?>
 <?xml version="1.0" encoding="utf-8"?>
 <shape xmlns:android="http://schemas.android.com/apk/res/android"
 <shape xmlns:android="http://schemas.android.com/apk/res/android"
     android:shape="oval">
     android:shape="oval">
-    <solid android:color="#ffffff" />
-
+       <solid android:color="#FF0000" />
 </shape>
 </shape>

+ 23 - 1
home/src/main/res/layout/activity_web_rtc_voip_audio.xml

@@ -40,7 +40,6 @@
     <LinearLayout
     <LinearLayout
         android:layout_width="wrap_content"
         android:layout_width="wrap_content"
         android:layout_height="wrap_content"
         android:layout_height="wrap_content"
-        android:layout_below="@id/ll_name"
         android:layout_alignParentBottom="true"
         android:layout_alignParentBottom="true"
         android:layout_centerHorizontal="true"
         android:layout_centerHorizontal="true"
         android:layout_marginBottom="11px"
         android:layout_marginBottom="11px"
@@ -72,5 +71,28 @@
 
 
     </LinearLayout>
     </LinearLayout>
 
 
+    <RelativeLayout
+        android:id="@+id/hands_free_relayout"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:layout_alignParentBottom="true"
+        android:layout_alignParentRight="true"
+        android:layout_marginBottom="11px"
+        android:layout_marginRight="28px"
+        android:layout_gravity="center" >
+        <ImageView
+            android:id="@+id/hands_free_image"
+            android:layout_width="55px"
+            android:layout_height="55px"
+            android:src="@drawable/av_handfree_hover" />
+<!--        <TextView-->
+<!--            android:layout_width="wrap_content"-->
+<!--            android:layout_height="wrap_content"-->
+<!--            android:layout_centerInParent="true"-->
+<!--            android:textSize="14px"-->
+<!--            android:textColor="#ffffff"-->
+<!--            android:text="免提"/>-->
+
+    </RelativeLayout>
 
 
 </RelativeLayout>
 </RelativeLayout>

+ 2 - 2
home/src/main/res/layout/activity_web_rtc_voip_audio_ringing.xml

@@ -73,8 +73,8 @@
             android:layout_gravity="center" >
             android:layout_gravity="center" >
             <ImageView
             <ImageView
                 android:id="@+id/change_over_image"
                 android:id="@+id/change_over_image"
-                android:layout_width="45px"
-                android:layout_height="45px"
+                android:layout_width="60px"
+                android:layout_height="60px"
                 android:src="@drawable/yu_yin_wei_chu_li" />
                 android:src="@drawable/yu_yin_wei_chu_li" />
             <TextView
             <TextView
                 android:layout_width="wrap_content"
                 android:layout_width="wrap_content"

+ 105 - 95
home/src/main/res/layout/watch_activity_event_detail.xml

@@ -1,122 +1,132 @@
 <?xml version="1.0" encoding="utf-8"?>
 <?xml version="1.0" encoding="utf-8"?>
 <layout>
 <layout>
-<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
-    android:layout_width="match_parent"
-    android:layout_height="match_parent"
-    android:background="#FFBDC3">
-
-    <LinearLayout
-        android:id="@+id/ll_title_name"
-        android:layout_width="wrap_content"
-        android:layout_height="wrap_content"
-        android:layout_centerHorizontal="true"
-        android:gravity="center_horizontal"
-        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/baby_mother_name"
-            android:layout_width="wrap_content"
-            android:layout_height="wrap_content"
-            android:layout_gravity="center_horizontal"
-            android:layout_marginTop="2px"
-            android:text="--"
-            android:textSize="16sp" />
-        <TextView
-            android:id="@+id/tv_frame_name"
-            android:layout_width="wrap_content"
-            android:layout_height="wrap_content"
-            android:layout_gravity="center_horizontal"
-            android:layout_marginTop="2px"
-            android:text="--"
-            android:textSize="16sp" />
 
 
-        <TextView
-            android:id="@+id/event_text"
+    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
+        android:layout_width="match_parent"
+        android:layout_height="match_parent"
+        android:background="#FFBDC3">
+
+        <LinearLayout
+            android:id="@+id/ll_title_name"
             android:layout_width="wrap_content"
             android:layout_width="wrap_content"
             android:layout_height="wrap_content"
             android:layout_height="wrap_content"
-            android:layout_gravity="center_horizontal"
-            android:layout_marginTop="10px"
-            android:text="--"
-            android:textSize="16sp" />
+            android:layout_centerHorizontal="true"
+            android:layout_marginTop="11px"
+            android:gravity="center_horizontal"
+            android:orientation="vertical">
 
 
-    </LinearLayout>
+            <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/baby_mother_name"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:layout_gravity="center_horizontal"
+                android:layout_marginTop="2px"
+                android:text="--"
+                android:textSize="16sp" />
 
 
-    <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_below="@id/ll_title_name"
-        android:layout_centerHorizontal="true"
-        android:text="11"
-        android:textSize="14sp"
-        android:visibility="gone"/>
+            <TextView
+                android:id="@+id/tv_frame_name"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:layout_gravity="center_horizontal"
+                android:layout_marginTop="2px"
+                android:text="--"
+                android:textSize="16sp" />
 
 
+            <TextView
+                android:id="@+id/event_text"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:layout_gravity="center_horizontal"
+                android:layout_marginTop="10px"
+                android:text="--"
+                android:textSize="16sp" />
 
 
+        </LinearLayout>
 
 
-    <RelativeLayout
-        android:id="@+id/call_relyout"
-        android:layout_width="wrap_content"
-        android:layout_height="wrap_content"
-        android:layout_alignParentBottom="true"
-        android:layout_centerHorizontal="true"
-        android:layout_marginBottom="16dp"
-        android:visibility="gone">
 
 
-        <ImageView
+        <TextView
+            android:id="@+id/call_duration_tv"
             android:layout_width="wrap_content"
             android:layout_width="wrap_content"
             android:layout_height="wrap_content"
             android:layout_height="wrap_content"
-            android:layout_centerInParent="true"
-            android:background="@drawable/yu_yin_jie_ting" />
-    </RelativeLayout>
+            android:layout_above="@+id/call_out_linlyout"
+            android:layout_below="@id/ll_title_name"
+            android:layout_centerHorizontal="true"
+            android:text="11"
+            android:textSize="14sp"
+            android:visibility="gone" />
 
 
 
 
-    <LinearLayout
-        android:id="@+id/call_out_linlyout"
-        android:layout_width="match_parent"
-        android:layout_height="65dp"
-        android:layout_alignParentBottom="true"
-        android:layout_centerHorizontal="true"
-        android:layout_marginTop="13px"
-        android:layout_marginBottom="11px"
-        android:orientation="horizontal">
-
-        <ImageView
-            android:id="@+id/back"
+        <RelativeLayout
+            android:id="@+id/call_relyout"
             android:layout_width="wrap_content"
             android:layout_width="wrap_content"
             android:layout_height="wrap_content"
             android:layout_height="wrap_content"
-            android:src="@drawable/btn_back" />
+            android:layout_alignParentBottom="true"
+            android:layout_centerHorizontal="true"
+            android:layout_marginBottom="16dp"
+            android:visibility="gone">
+
+            <ImageView
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:layout_centerInParent="true"
+                android:background="@drawable/yu_yin_jie_ting" />
+        </RelativeLayout>
+
 
 
         <LinearLayout
         <LinearLayout
+            android:id="@+id/call_out_linlyout"
             android:layout_width="match_parent"
             android:layout_width="match_parent"
-            android:layout_height="wrap_content"
-            android:layout_gravity="center_vertical"
-            android:orientation="vertical"
-            android:gravity="right">
-            <TextView
-                android:id="@+id/event_end_text"
+            android:layout_height="65dp"
+            android:layout_alignParentBottom="true"
+            android:layout_centerHorizontal="true"
+            android:layout_marginTop="13px"
+            android:layout_marginBottom="11px"
+            android:orientation="horizontal">
+
+            <ImageView
+                android:id="@+id/back"
                 android:layout_width="wrap_content"
                 android:layout_width="wrap_content"
                 android:layout_height="wrap_content"
                 android:layout_height="wrap_content"
-                android:layout_marginRight="5dp"
-                android:text=""/>
-            <ImageView
-                android:id="@+id/event_status_img"
-                android:layout_width="80px"
-                android:layout_height="35px"
-                android:layout_marginLeft="20px"
-                android:layout_marginRight="5dp"
-                android:src="@drawable/icon_switch_off" />
-        </LinearLayout>
+                android:src="@drawable/btn_back" />
 
 
-    </LinearLayout>
+            <LinearLayout
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:layout_gravity="center_vertical"
+                android:gravity="right"
+                android:orientation="vertical">
+
+                <TextView
+                    android:id="@+id/event_end_text"
+                    android:layout_width="wrap_content"
+                    android:layout_height="wrap_content"
+                    android:layout_marginRight="5dp"
+                    android:text="" />
+                <!--            <ImageView-->
+                <!--                android:id="@+id/event_status_img"-->
+                <!--                android:layout_width="80px"-->
+                <!--                android:layout_height="35px"-->
+                <!--                android:layout_marginLeft="20px"-->
+                <!--                android:layout_marginRight="5dp"-->
+                <!--                android:src="@drawable/icon_switch_off" />-->
+                <ImageView
+                    android:id="@+id/event_status_img"
+                    android:layout_width="120px"
+                    android:layout_height="55px"
+                    android:layout_marginLeft="20px"
+                    android:layout_marginRight="5dp"
+                    android:src="@drawable/icon_switch_off" />
+            </LinearLayout>
 
 
+        </LinearLayout>
 
 
-</RelativeLayout>
+
+    </RelativeLayout>
 </layout>
 </layout>

+ 2 - 3
home/src/main/res/layout/watch_activity_home.xml

@@ -82,12 +82,11 @@
 
 
                     <TextView
                     <TextView
                         android:id="@+id/list_item_img_icon_num"
                         android:id="@+id/list_item_img_icon_num"
-                        android:layout_width="30dp"
-                        android:layout_height="30dp"
+                        android:layout_width="10dp"
+                        android:layout_height="10dp"
                         android:layout_alignParentRight="true"
                         android:layout_alignParentRight="true"
                         android:background="@drawable/shape_untreated_quantity"
                         android:background="@drawable/shape_untreated_quantity"
                         android:gravity="center"
                         android:gravity="center"
-                        android:text="0"
                         android:textColor="#FF3030"
                         android:textColor="#FF3030"
                         android:textSize="12sp" />
                         android:textSize="12sp" />
 
 

+ 261 - 0
home/src/main/res/layout/watch_activity_home2.xml

@@ -0,0 +1,261 @@
+<?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">
+
+      <include
+          android:id="@+id/watch_activity_register_layout"
+          layout="@layout/watch_activity_register"
+          ></include>>
+
+        <LinearLayout
+            android:id="@+id/watch_activity_home_linyout"
+            android:layout_width="match_parent"
+            android:layout_height="match_parent"
+            android:orientation="vertical"
+            android:visibility="gone">
+
+            <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">
+
+
+                <RelativeLayout
+                    android:id="@+id/user_nume_linlyout"
+                    android:layout_width="0dp"
+                    android:layout_height="match_parent"
+                    android:layout_weight="1"
+                    android:background="#5CB615"
+                    >
+
+                    <TextView
+                        android:id="@+id/list_item_img_icon_num"
+                        android:layout_width="10dp"
+                        android:layout_height="10dp"
+                        android:layout_alignParentRight="true"
+                        android:background="@drawable/shape_untreated_quantity"
+                        android:gravity="center"
+                        android:textColor="#FF3030"
+                        android:textSize="12sp" />
+
+                    <LinearLayout
+                        android:layout_width="match_parent"
+                        android:layout_height="match_parent"
+                        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" />
+
+                        <TextView
+                            android:id="@+id/watch_role_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>
+                </RelativeLayout>
+
+                <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"
+                            android:orientation="vertical">
+
+                            <ImageView
+                                android:id="@+id/network_state_imagev"
+                                android:layout_width="wrap_content"
+                                android:layout_height="wrap_content"
+                                android:src="@drawable/wifi_lian_jie" />
+
+                            <TextView
+                                android:id="@+id/wifi_rssi_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="#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" />
+
+                            <TextView
+                                android:id="@+id/battery_warning_tv"
+                                android:layout_width="wrap_content"
+                                android:layout_height="wrap_content"
+                                android:text=""
+                                android:textColor="#ffffff"
+                                android:textSize="16px"
+                                android:visibility="gone" />
+                        </LinearLayout>
+
+
+                        <LinearLayout
+                            android:id="@+id/other_linyout"
+                            android:layout_width="0dp"
+                            android:layout_height="match_parent"
+                            android:layout_weight="1"
+                            android:background="#FFDE00"
+                            android:gravity="center"
+                            android:orientation="vertical">
+
+                            <TextView
+                                android:id="@+id/sip_state_tv"
+                                android:layout_width="8dp"
+                                android:layout_height="8dp"
+                                android:background="#FF0000"
+                                 />
+
+                            <ImageView
+                                android:layout_width="wrap_content"
+                                android:layout_height="wrap_content"
+                                android:layout_marginTop="2dp"
+                                android:src="@drawable/geng_duo" />
+
+
+                        </LinearLayout>
+
+                    </LinearLayout>
+
+                </LinearLayout>
+
+            </LinearLayout>
+
+
+        </LinearLayout>
+
+    </RelativeLayout>
+</layout>

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

@@ -27,6 +27,12 @@ class Constants {
 
 
         val EVENT_UNTREATED_QUANTITY = 0x10 //未处理数量
         val EVENT_UNTREATED_QUANTITY = 0x10 //未处理数量
 
 
+        val EVENT_TCP_BREAK = 0x15 //tcp掉线
+
+        val EVENT_TCP_RETRANSMISSION  = 0x16 //tcp掉线
+
+        val EVENT_TCP_APP_UPDATE  = 0x13 //app更新
+
         var APP_PATH = "" //app版本
         var APP_PATH = "" //app版本
     }
     }
 
 

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

@@ -2,13 +2,25 @@ package com.wdkl.ncs.android.middleware.logic.contract.home
 
 
 import com.wdkl.ncs.android.lib.base.BaseContract
 import com.wdkl.ncs.android.lib.base.BaseContract
 import com.wdkl.ncs.android.middleware.model.dos.AppVersionDO
 import com.wdkl.ncs.android.middleware.model.dos.AppVersionDO
+import com.wdkl.ncs.android.middleware.model.dos.DeviceDO
+import com.wdkl.ncs.android.middleware.model.dto.TcpSeverDTO
 import com.wdkl.ncs.android.middleware.model.vo.WatchContactsVO
 import com.wdkl.ncs.android.middleware.model.vo.WatchContactsVO
 
 
 interface WatchHomeActivityContract{
 interface WatchHomeActivityContract{
     interface View : BaseContract.BaseView{
     interface View : BaseContract.BaseView{
+        //显示设备信息
+        fun showData(data : DeviceDO)
+        //显示tcp通讯地址
+        fun setTcpServerHost(tcpSeverDTO: TcpSeverDTO)
+        //版本号信息
         fun render(appInfo: AppVersionDO)
         fun render(appInfo: AppVersionDO)
     }
     }
     interface Presenter : BaseContract.BasePresenter{
     interface Presenter : BaseContract.BasePresenter{
+        //获取设备信息
+        fun loadData(ethMac:String)
+        //获取tcp服务器地址
+        fun loadTcpServerHost()
+        //获取版本信息
         fun getAppVersion(partId: Int, deviceType: Int)
         fun getAppVersion(partId: Int, deviceType: Int)
     }
     }
 }
 }

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

@@ -11,10 +11,13 @@ import com.wdkl.ncs.android.lib.utils.ConnectionObserver
 import com.wdkl.ncs.android.lib.utils.getEventCenter
 import com.wdkl.ncs.android.lib.utils.getEventCenter
 import com.wdkl.ncs.android.lib.utils.getJsonString
 import com.wdkl.ncs.android.lib.utils.getJsonString
 import com.wdkl.ncs.android.lib.vo.NetStateEvent
 import com.wdkl.ncs.android.lib.vo.NetStateEvent
+import com.wdkl.ncs.android.middleware.api.WatchDeviceInfoAndTCPMailingAddressApi
 import com.wdkl.ncs.android.middleware.api.WatchManageDeviceApi
 import com.wdkl.ncs.android.middleware.api.WatchManageDeviceApi
 import com.wdkl.ncs.android.middleware.di.MiddlewareDaggerComponent
 import com.wdkl.ncs.android.middleware.di.MiddlewareDaggerComponent
 import com.wdkl.ncs.android.middleware.logic.contract.home.WatchHomeActivityContract
 import com.wdkl.ncs.android.middleware.logic.contract.home.WatchHomeActivityContract
 import com.wdkl.ncs.android.middleware.model.dos.AppVersionDO
 import com.wdkl.ncs.android.middleware.model.dos.AppVersionDO
+import com.wdkl.ncs.android.middleware.model.dos.DeviceDO
+import com.wdkl.ncs.android.middleware.model.dto.TcpSeverDTO
 import io.reactivex.disposables.Disposable
 import io.reactivex.disposables.Disposable
 import javax.inject.Inject
 import javax.inject.Inject
 
 
@@ -22,9 +25,16 @@ class WatchHomeActivityPresenter @Inject constructor(): RxPresenter<WatchHomeAct
 
 
 
 
 
 
+
+
+    /**
+     *获取当前设备数据api
+     */
     @Inject
     @Inject
-    protected lateinit var watchManageDeviceApi: WatchManageDeviceApi
+    protected lateinit var registerDeviceApi: WatchDeviceInfoAndTCPMailingAddressApi
 
 
+    @Inject
+    protected lateinit var watchManageDeviceApi: WatchManageDeviceApi
 
 
 
 
     override fun bindDagger() {
     override fun bindDagger() {
@@ -39,7 +49,25 @@ class WatchHomeActivityPresenter @Inject constructor(): RxPresenter<WatchHomeAct
 
 
         override fun onNextWithConnection(result: Any, connectionQuality: ConnectionQuality) {
         override fun onNextWithConnection(result: Any, connectionQuality: ConnectionQuality) {
             providerView().complete()
             providerView().complete()
-            providerView().render(result as AppVersionDO)
+            when (result) {
+                is DeviceDO -> {
+                    providerView().complete()
+                    providerView().showData(result as DeviceDO)
+                }
+
+                is TcpSeverDTO -> {
+                    //tcp服务器地址
+                    providerView().complete("")
+                    providerView().setTcpServerHost(result)
+                }
+                 is AppVersionDO -> {
+                     //版本信息
+                     providerView().complete("")
+                     providerView().render(result as AppVersionDO)
+                 }
+
+            }
+
         }
         }
 
 
         override fun onErrorWithConnection(error: ExceptionHandle.ResponeThrowable, connectionQuality: ConnectionQuality) {
         override fun onErrorWithConnection(error: ExceptionHandle.ResponeThrowable, connectionQuality: ConnectionQuality) {
@@ -56,6 +84,36 @@ class WatchHomeActivityPresenter @Inject constructor(): RxPresenter<WatchHomeAct
     }
     }
 
 
 
 
+    /**
+     *获取当前设备数据
+     */
+    override fun loadData(ethMac:String) {
+
+        registerDeviceApi.getDeviceMessage(ethMac).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(observer)
+
+    }
+
+    override fun loadTcpServerHost() {
+        registerDeviceApi.getTcpServerHost()
+                .map {
+                    val gson = GsonBuilder().setFieldNamingPolicy(FieldNamingPolicy.LOWER_CASE_WITH_UNDERSCORES).create()
+                    val tcpServer = gson.fromJson(it.getJsonString(), TcpSeverDTO::class.java)
+
+                    return@map tcpServer
+                }
+                .compose(ThreadFromUtils.defaultSchedulers())
+                .subscribe(observer)
+    }
+
+
     override fun getAppVersion(partId: Int, deviceType: Int) {
     override fun getAppVersion(partId: Int, deviceType: Int) {
 
 
         watchManageDeviceApi.getAppVersion(partId, deviceType)
         watchManageDeviceApi.getAppVersion(partId, deviceType)

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

@@ -6,6 +6,9 @@ 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.DeviceChannel;
 import com.wdkl.ncs.android.middleware.tcp.channel.DeviceUtil;
 import com.wdkl.ncs.android.middleware.tcp.channel.DeviceUtil;
 import com.wdkl.ncs.android.middleware.tcp.dto.TcpModel;
 import com.wdkl.ncs.android.middleware.tcp.dto.TcpModel;
+import com.wdkl.ncs.android.middleware.utils.MessageEvent;
+
+import org.greenrobot.eventbus.EventBus;
 
 
 import java.util.concurrent.TimeUnit;
 import java.util.concurrent.TimeUnit;
 
 
@@ -24,7 +27,7 @@ public class TcpClientHandler extends SimpleChannelInboundHandler<String> {
 
 
     ChannelHandlerContext ctx;
     ChannelHandlerContext ctx;
     //重连间隔
     //重连间隔
-    private static Integer retrySeconds = 5;
+    private static Integer retrySeconds = 2;
     //重连计数
     //重连计数
     private static Integer retryTimes = 0;
     private static Integer retryTimes = 0;
     //总共总连接次数,总连接次数过多可能是网络不稳定
     //总共总连接次数,总连接次数过多可能是网络不稳定
@@ -46,6 +49,9 @@ public class TcpClientHandler extends SimpleChannelInboundHandler<String> {
         retryTimes = 0;
         retryTimes = 0;
         TcpModel tcpModel = DeviceUtil.deviceConnect(Constants.Companion.getImei());
         TcpModel tcpModel = DeviceUtil.deviceConnect(Constants.Companion.getImei());
         TcpClient.getInstance().sendMsg(tcpModel.toJson());
         TcpClient.getInstance().sendMsg(tcpModel.toJson());
+//        EventBus.getDefault().register(this);
+//        EventBus.getDefault().post(new MessageEvent(tcpModel, Constants.Companion.getEVENT_TCP_RETRANSMISSION()));
+//        EventBus.getDefault().unregister(this);
     }
     }
 
 
     //断开连接
     //断开连接
@@ -82,11 +88,12 @@ public class TcpClientHandler extends SimpleChannelInboundHandler<String> {
         if (evt instanceof IdleStateEvent){
         if (evt instanceof IdleStateEvent){
             IdleStateEvent event = (IdleStateEvent)evt;
             IdleStateEvent event = (IdleStateEvent)evt;
             if (event.state()== IdleState.WRITER_IDLE){
             if (event.state()== IdleState.WRITER_IDLE){
-                ctx.writeAndFlush("0");
+//                ctx.writeAndFlush("0");
               //读心跳包超时执行
               //读心跳包超时执行
             }else if (event.state() == IdleState.READER_IDLE){
             }else if (event.state() == IdleState.READER_IDLE){
                 Log.i(TAG,"TcpClientHandler ===> pong from server failed");
                 Log.i(TAG,"TcpClientHandler ===> pong from server failed");
-                ctx.close();
+               ctx.writeAndFlush("0");
+//                ctx.close();
             }
             }
         }
         }
     }
     }

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

@@ -7,6 +7,7 @@ import android.os.PowerManager;
 import android.util.Log;
 import android.util.Log;
 
 
 import com.google.gson.Gson;
 import com.google.gson.Gson;
+import com.wdkl.ncs.android.component.nursehome.common.Constants;
 import com.wdkl.ncs.android.middleware.model.vo.InteractionVO;
 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.dto.TcpModel;
 import com.wdkl.ncs.android.middleware.tcp.enums.TcpAction;
 import com.wdkl.ncs.android.middleware.tcp.enums.TcpAction;
@@ -33,7 +34,12 @@ public class DeviceChannel {
 
 
         if (tcpModel.getType()== TcpType.VOICE && tcpModel.getAction()==TcpAction.VoiceAction.SUCCESS){
         if (tcpModel.getType()== TcpType.VOICE && tcpModel.getAction()==TcpAction.VoiceAction.SUCCESS){
             EventBus.getDefault().post(new MessageEvent(tcpModel, 1));
             EventBus.getDefault().post(new MessageEvent(tcpModel, 1));
-        } else if ((tcpModel.getType()== TcpType.VOICE && tcpModel.getAction() == TcpAction.VoiceAction.ACCEPT)  //我方呼出,对方接受
+        } else if(tcpModel.getType()== TcpType.VOICE && tcpModel.getAction() == TcpAction.VoiceAction.CALL &&calling){
+            InteractionVO interactionVO = new Gson().fromJson(tcpModel.getData().toString(), InteractionVO.class);
+            responseTcpModel = VoiceUtil.voiceCalling(Integer.parseInt(Constants.Companion.getIds()), tcpModel.getFromId(),interactionVO.getId());
+            //todo 给服务器发送正在通话中 tcp
+            return responseTcpModel;
+        }else if ((tcpModel.getType()== TcpType.VOICE && tcpModel.getAction() == TcpAction.VoiceAction.ACCEPT)  //我方呼出,对方接受
             //todo:调用通话中界面;建立数据通话
             //todo:调用通话中界面;建立数据通话
             || (tcpModel.getType()== TcpType.VOICE && tcpModel.getAction() == TcpAction.VoiceAction.REJECT) //我方呼出,对方拒绝
             || (tcpModel.getType()== TcpType.VOICE && tcpModel.getAction() == TcpAction.VoiceAction.REJECT) //我方呼出,对方拒绝
             //todo: 清掉呼出的TcpModel,通话中界面更新 --- 显示对方拒绝并停留3秒,结束至正常界面
             //todo: 清掉呼出的TcpModel,通话中界面更新 --- 显示对方拒绝并停留3秒,结束至正常界面
@@ -43,7 +49,22 @@ public class DeviceChannel {
             || (tcpModel.getType()== TcpType.VOICE && tcpModel.getAction() == TcpAction.VoiceAction.FAILED) //我方呼出,对方不在线,设备离线或其它错误
             || (tcpModel.getType()== TcpType.VOICE && tcpModel.getAction() == TcpAction.VoiceAction.FAILED) //我方呼出,对方不在线,设备离线或其它错误
             || (tcpModel.getType()== TcpType.VOICE && tcpModel.getAction() == TcpAction.VoiceAction.CANCEL)) { //对方取消
             || (tcpModel.getType()== TcpType.VOICE && tcpModel.getAction() == TcpAction.VoiceAction.CANCEL)) { //对方取消
             //todo: 清掉呼出的TcpModel,通话中界面更新 --- 显示对方离线并停留3秒,结束至正常界面;更新左侧
             //todo: 清掉呼出的TcpModel,通话中界面更新 --- 显示对方离线并停留3秒,结束至正常界面;更新左侧
-            EventBus.getDefault().post(new MessageEvent(tcpModel, 2));
+            if (tcpModel.getAction() == TcpAction.VoiceAction.CALLING){
+                final TcpModel tm = tcpModel;
+                new Thread(new Runnable() {
+                    @Override
+                    public void run() {
+                        try {
+                            Thread.sleep(3000);
+                        } catch (InterruptedException e) {
+                            e.printStackTrace();
+                        }
+                        EventBus.getDefault().post(new MessageEvent(tm, 2));
+                    }
+                }).start();
+            } else {
+                EventBus.getDefault().post(new MessageEvent(tcpModel, 2));
+            }
         } else if ((tcpModel.getType()==TcpType.IM && tcpModel.getAction() == TcpAction.IMAction.MSG)
         } else if ((tcpModel.getType()==TcpType.IM && tcpModel.getAction() == TcpAction.IMAction.MSG)
             || (tcpModel.getType()==TcpType.EVENT && tcpModel.getAction() == TcpAction.EventAction.KEY_CLICK)) {
             || (tcpModel.getType()==TcpType.EVENT && tcpModel.getAction() == TcpAction.EventAction.KEY_CLICK)) {
             EventBus.getDefault().post(new MessageEvent(tcpModel, 3));
             EventBus.getDefault().post(new MessageEvent(tcpModel, 3));
@@ -53,6 +74,10 @@ public class DeviceChannel {
                 tcpModel.getType() == TcpType.SOS && tcpModel.getAction() == TcpAction.SOSAction.CANCEL){
                 tcpModel.getType() == TcpType.SOS && tcpModel.getAction() == TcpAction.SOSAction.CANCEL){
                //todo 紧急呼叫
                //todo 紧急呼叫
             EventBus.getDefault().post(new MessageEvent(tcpModel, 0));
             EventBus.getDefault().post(new MessageEvent(tcpModel, 0));
+        }else if(tcpModel.getType() == TcpType.DEVICE &&tcpModel.getAction() == TcpAction.DeviceAction.RESTART||
+                tcpModel.getType() == TcpType.DEVICE && tcpModel.getAction() == TcpAction.DeviceAction.DEVICE_REFRESH||
+                tcpModel.getType() == TcpType.DEVICE && tcpModel.getAction() == TcpAction.DeviceAction.APP_UPDATE){
+            EventBus.getDefault().post(new MessageEvent(tcpModel, Constants.Companion.getEVENT_TCP_APP_UPDATE()));
         }else {
         }else {
             EventBus.getDefault().post(new MessageEvent(tcpModel, 0));
             EventBus.getDefault().post(new MessageEvent(tcpModel, 0));
         }
         }

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

@@ -170,6 +170,8 @@ public interface TcpAction {
     enum DeviceAction implements TcpAction {
     enum DeviceAction implements TcpAction {
         RESTART("重启"),
         RESTART("重启"),
         CONNECT("连接"),
         CONNECT("连接"),
+        APP_UPDATE("APP更新"),
+        DEVICE_REFRESH("设备刷新"),
         USER_CHANGE("用户绑定");
         USER_CHANGE("用户绑定");
         private String description;
         private String description;
         DeviceAction(String description){
         DeviceAction(String description){